xref: /haiku/src/add-ons/kernel/file_systems/netfs/headers/shared/Utils.h (revision 2b76973fa2401f7a5edf68e6470f3d3210cbcff3)
1 // Utils.h
2 
3 #ifndef UTILS_H
4 #define UTILS_H
5 
6 #ifdef HAIKU_TARGET_PLATFORM_BEOS
7 #	include <socket.h>
8 #else
9 #	include <sys/socket.h>
10 #	include <unistd.h>
11 #endif
12 
13 #include <SupportDefs.h>
14 
15 #include "Compatibility.h"
16 
17 template<typename T> T max(const T& a, const T& b) { return (a > b ? a : b); }
18 template<typename T> T min(const T& a, const T& b) { return (a < b ? a : b); }
19 
20 // safe_closesocket
21 /*!	There seems to be race condition on a net_server system, if two threads
22 	try to close the same socket at the same time. This is work-around. The
23 	variable which stores the socket ID must be a vint32.
24 */
25 static inline
26 void
27 safe_closesocket(vint32& socketVar)
28 {
29 	int32 socket = atomic_or(&socketVar, -1);
30 #ifdef __HAIKU__
31 	close(socket);
32 #else
33 	if (socket >= 0) {
34 #	ifndef HAIKU_TARGET_PLATFORM_BEOS
35 		shutdown(socket, SHUTDOWN_BOTH);
36 #	endif
37 		closesocket(socket);
38 	}
39 #endif
40 }
41 
42 #endif	// UTILS_H
43