23 #ifndef FAUDES_PLATFORM_H
24 #define FAUDES_PLATFORM_H
28 #ifndef FAUDES_WINDOWS
29 #ifndef FAUDES_GENERIC
31 #if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(__WINDOWS__)
32 #define FAUDES_WINDOWS
34 #if defined(__MINGW32__) || defined(__MINGW64__)
35 #define FAUDES_WINDOWS
37 #if defined(__unix__) || defined(__linus__) || defined(__linux__)
40 #if defined(__APPLE__) && defined(__MACH__)
43 #define FAUDES_GENERIC
57 #ifdef FAUDES_BUILD_DSO
58 #define FAUDES_API __attribute__ ((dllexport))
60 #ifdef FAUDES_BUILD_APP
61 #define FAUDES_API __attribute__ ((dllimport))
64 #ifdef FAUDES_BUILD_DSO
65 #define FAUDES_API __declspec(dllexport)
67 #ifdef FAUDES_BUILD_APP
68 #define FAUDES_API __declspec(dllimport)
75 #ifdef FAUDES_BUILD_DSO
77 #define FAUDES_API __attribute__ ((visibility ("default")))
78 #define FAUDES_TAPI __attribute__ ((visibility ("default")))
120 #ifdef FAUDES_SYSTIME
122 #include <sys/time.h>
125 #ifdef FAUDES_NETWORK
126 #include <sys/socket.h>
127 #include <arpa/inet.h>
131 #ifdef FAUDES_THREADS
139 #ifdef FAUDES_WINDOWS
141 #ifdef FAUDES_NETWORK
142 #include <winsock2.h>
143 #include <ws2tcpip.h>
147 #ifndef WIN32_LEAN_AND_MEAN
148 #define WIN32_LEAN_AND_MEAN
149 #define FAUDES_LEAN_AND_MEAN
152 #ifdef FAUDES_LEAN_AND_MEAN
153 #undef FAUDES_LEAN_AND_MEAN
154 #undef WIN32_LEAN_AND_MEAN
157 #ifdef FAUDES_SYSTIME
160 #include <mmsystem.h>
164 #ifdef FAUDES_THREADS
225 #ifdef FAUDES_SYSTIME
229 typedef timespec faudes_systime_t;
230 typedef long int faudes_mstime_t;
232 #ifdef FAUDES_WINDOWS
237 typedef long int faudes_mstime_t;
239 #ifdef FAUDES_GENERIC
240 #error option systime not available on generic platform
244 extern FAUDES_API void faudes_gettimeofday(faudes_systime_t* now);
258 #ifdef FAUDES_NETWORK
261 extern FAUDES_API int faudes_closesocket(
int fd);
262 extern FAUDES_API int faudes_setsockopt(
int fd,
int level,
int optname,
const void *optval, socklen_t optlen);
263 extern FAUDES_API int faudes_getsockopt(
int fd,
int level,
int optname,
void *optval, socklen_t *optlen);
264 extern FAUDES_API int faudes_setsocket_nonblocking(
int fd,
bool noblo);
265 extern FAUDES_API int faudes_getsocket_error(
int fd);
269 #define SO_REUSEPORT SO_REUSEADDR
275 #ifdef FAUDES_THREADS
287 #define FAUDES_THREAD_SUCCESS 0
288 #define FAUDES_THREAD_ERROR 1
289 #define FAUDES_THREAD_TIMEOUT 2
293 typedef pthread_t faudes_thread_t;
299 #ifdef FAUDES_WINDOWS
302 void *(*mFnct)(
void *);
305 } faudes_thread_record_t;
306 typedef faudes_thread_record_t* faudes_thread_t;
310 #ifdef FAUDES_GENERIC
311 #error option threads not available on generic platform
316 extern FAUDES_API int faudes_thread_create(faudes_thread_t *thr,
void *(*fnct)(
void *),
void *arg);
317 extern FAUDES_API faudes_thread_t faudes_thread_current(
void);
318 extern FAUDES_API int faudes_thread_detach(faudes_thread_t thr);
319 extern FAUDES_API int faudes_thread_equal(faudes_thread_t thr0, faudes_thread_t thr1);
320 extern FAUDES_API void faudes_thread_exit(
void* res);
321 extern int faudes_thread_join(faudes_thread_t thr,
void **res);
325 typedef pthread_mutex_t faudes_mutex_t;
329 #ifdef FAUDES_WINDOWS
330 typedef CRITICAL_SECTION faudes_mutex_t;
334 extern FAUDES_API int faudes_mutex_init(faudes_mutex_t* mtx);
335 extern FAUDES_API void faudes_mutex_destroy(faudes_mutex_t* mtx);
336 extern FAUDES_API int faudes_mutex_lock(faudes_mutex_t *mtx);
337 extern FAUDES_API int faudes_mutex_trylock(faudes_mutex_t *mtx);
338 extern FAUDES_API int faudes_mutex_unlock(faudes_mutex_t *mtx);
342 typedef pthread_cond_t faudes_cond_t;
349 #ifdef FAUDES_WINDOWS
352 unsigned int mWaitersCount;
353 CRITICAL_SECTION mWaitersCountMutex;
358 extern FAUDES_API int faudes_cond_init(faudes_cond_t* cond);
359 extern FAUDES_API void faudes_cond_destroy(faudes_cond_t* cond);
360 extern FAUDES_API int faudes_cond_signal(faudes_cond_t *cond);
361 extern FAUDES_API int faudes_cond_broadcast(faudes_cond_t *cond);
362 extern FAUDES_API int faudes_cond_wait(faudes_cond_t *cond, faudes_mutex_t *mtx);
363 extern FAUDES_API int faudes_cond_timedwait(faudes_cond_t *cond, faudes_mutex_t *mtx,
const faudes_systime_t *abstime);
364 extern FAUDES_API int faudes_cond_reltimedwait(faudes_cond_t *cond, faudes_mutex_t *mtx, faudes_mstime_t duration);