27 #ifndef _UCOMMON_PLATFORM_H_
28 #define _UCOMMON_PLATFORM_H_
41 #define UCOMMON_NAMESPACE ucommon
42 #define NAMESPACE_UCOMMON namespace ucommon {
43 #define END_NAMESPACE }
54 #ifndef _POSIX_PTHREAD_SEMANTICS
55 #define _POSIX_PTHREAD_SEMANTICS
59 #if defined(__GNUC__) && (__GNUC < 3) && !defined(_GNU_SOURCE)
63 #if __GNUC__ > 3 || (__GNUC__ == 3 && (__GNU_MINOR__ > 3))
64 #define __PRINTF(x,y) __attribute__ ((format (printf, x, y)))
65 #define __SCANF(x, y) __attribute__ ((format (scanf, x, y)))
66 #define __MALLOC __attribute__ ((malloc))
70 #define __PRINTF(x, y)
89 #if defined(__ANDROID__) || defined(NEW_STDCPP) || defined(OLD_STDCPP)
90 #define _UCOMMON_EXTENDED_
95 #if defined(_MSC_VER) || defined(WIN32) || defined(_WIN32)
102 #if defined(_M_X64) || defined(_M_ARM)
103 #define _MSCONDITIONALS_
105 #define _WIN32_WINNT 0x0600
119 #pragma warning(disable: 4251)
120 #pragma warning(disable: 4996)
121 #pragma warning(disable: 4355)
122 #pragma warning(disable: 4290)
123 #pragma warning(disable: 4291)
126 #if defined(__BORLANDC__) && !defined(__MT__)
127 #error Please enable multithreading
130 #if defined(_MSC_VER) && !defined(_MT)
131 #error Please enable multithreading (Project -> Settings -> C/C++ -> Code Generation -> Use Runtime Library)
136 #define _WIN32_WINNT 0x0501
141 #define WINVER _WIN32_WINNT
144 #ifndef WIN32_LEAN_AND_MEAN
145 #define WIN32_LEAN_AND_MEAN
148 #include <winsock2.h>
149 #include <ws2tcpip.h>
151 #if defined(_MSC_VER)
152 typedef signed long ssize_t;
158 #ifdef UCOMMON_STATIC
161 #define __EXPORT __declspec(dllimport)
167 #if defined(UCOMMON_RUNTIME) || defined(UCOMMON_STATIC)
170 #define __SHARED __EXPORT
173 #elif UCOMMON_VISIBILITY > 0
174 #define __EXPORT __attribute__ ((visibility("default")))
175 #define __LOCAL __attribute__ ((visibility("hidden")))
176 #define __SHARED __attribute__ ((visibility("default")))
187 #include <sys/stat.h>
191 #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 7)) && defined(_UCOMMON_EXTENDED_) && defined(__MINGW_WINPTHREAD__)
197 #undef _MSCONDITIONALS_
200 typedef DWORD pthread_t;
201 typedef CRITICAL_SECTION pthread_mutex_t;
203 typedef char *caddr_t;
205 typedef SOCKET socket_t;
208 typedef struct timespec {
214 inline void sleep(
int seconds)
215 {::Sleep((seconds * 1000l));}
219 #define SERVICE_MAIN(id, argc, argv) void WINAPI service_##id(DWORD argc, LPSTR *argv)
221 typedef LPSERVICE_MAIN_FUNCTION cpr_service_t;
224 inline void pthread_exit(
void *p)
225 {_endthreadex((DWORD)0);}
227 inline pthread_t pthread_self(
void)
228 {
return (pthread_t)GetCurrentThreadId();}
230 inline int pthread_mutex_init(pthread_mutex_t *mutex,
void *x)
231 {InitializeCriticalSection(mutex);
return 0;}
233 inline void pthread_mutex_destroy(pthread_mutex_t *mutex)
234 {DeleteCriticalSection(mutex);}
236 inline void pthread_mutex_lock(pthread_mutex_t *mutex)
237 {EnterCriticalSection(mutex);}
239 inline void pthread_mutex_unlock(pthread_mutex_t *mutex)
240 {LeaveCriticalSection(mutex);}
243 inline char *strdup(
const char *s)
246 inline int stricmp(
const char *s1,
const char *s2)
247 {
return _stricmp(s1, s2);}
249 inline int strnicmp(
const char *s1,
const char *s2,
size_t l)
250 {
return _strnicmp(s1, s2, l);}
253 #elif defined(__PTH__)
256 #include <sys/wait.h>
258 typedef int socket_t;
260 #define INVALID_SOCKET -1
261 #define INVALID_HANDLE_VALUE -1
264 #define pthread_mutex_t pth_mutex_t
265 #define pthread_cond_t pth_cond_t
266 #define pthread_t pth_t
268 inline int pthread_sigmask(
int how,
const sigset_t *set, sigset_t *oset)
269 {
return pth_sigmask(how, set, oset);};
271 inline void pthread_exit(
void *p)
274 inline void pthread_kill(pthread_t tid,
int sig)
275 {pth_raise(tid, sig);};
277 inline int pthread_mutex_init(pthread_mutex_t *mutex,
void *x)
278 {
return pth_mutex_init(mutex) != 0;};
280 inline void pthread_mutex_destroy(pthread_mutex_t *mutex)
283 inline void pthread_mutex_lock(pthread_mutex_t *mutex)
284 {pth_mutex_acquire(mutex, 0, NULL);};
286 inline void pthread_mutex_unlock(pthread_mutex_t *mutex)
287 {pth_mutex_release(mutex);};
289 inline void pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
290 {pth_cond_await(cond, mutex, NULL);};
292 inline void pthread_cond_signal(pthread_cond_t *cond)
293 {pth_cond_notify(cond, FALSE);};
295 inline void pthread_cond_broadcast(pthread_cond_t *cond)
296 {pth_cond_notify(cond, TRUE);};
302 typedef int socket_t;
304 #define INVALID_SOCKET -1
305 #define INVALID_HANDLE_VALUE -1
311 typedef signed __int8 int8_t;
312 typedef unsigned __int8 uint8_t;
313 typedef signed __int16 int16_t;
314 typedef unsigned __int16 uint16_t;
315 typedef signed __int32 int32_t;
316 typedef unsigned __int32 uint32_t;
317 typedef signed __int64 int64_t;
318 typedef unsigned __int64 uint64_t;
319 typedef char *caddr_t;
322 #define snprintf _snprintf
323 #define vsnprintf _vsnprintf
327 #include <sys/stat.h>
328 #include <sys/types.h>
350 #define ENETDOWN ((int)(WSAENETDOWN))
353 #define EINPROGRESS ((int)(WSAEINPROGRESS))
356 #define ENOPROTOOPT ((int)(WSAENOPROTOOPT))
359 #define EADDRINUSE ((int)(WSAEADDRINUSE))
361 #ifndef EADDRNOTAVAIL
362 #define EADDRNOTAVAIL ((int)(WSAEADDRNOTAVAIL))
365 #define ENETUNREACH ((int)(WSAENETUNREACH))
368 #define EHOSTUNREACH ((int)(WSAEHOSTUNREACH))
371 #define EHOSTDOWN ((int)(WSAEHOSTDOWN))
374 #define ENETRESET ((int)(WSAENETRESET))
377 #define ECONNABORTED ((int)(WSAECONNABORTED))
380 #define ECONNRESET ((int)(WSAECONNRESET))
383 #define EISCONN ((int)(WSAEISCONN))
386 #define ENOTCONN ((int)(WSAENOTCONN))
389 #define ESHUTDOWN ((int)(WSAESHUTDOWN))
392 #define ETIMEDOUT ((int)(WSAETIMEDOUT))
395 #define ECONNREFUSED ((int)(WSAECONNREFUSED))
412 #define PROGRAM_MAIN(argc, argv) extern "C" int main(int argc, char **argv)
413 #define PROGRAM_EXIT(code) return code
417 #define SERVICE_MAIN(id, argc, argv) void service_##id(int argc, char **argv)
418 typedef void (*cpr_service_t)(
int argc,
char **argv);
423 #define crit(x, text) assert(x)
425 #define crit(x, text) if(!(x)) cpr_runtime_error(text)
436 {
return ((memory) ?
new(((caddr_t)memory)) T : NULL);}
438 typedef long Integer;
439 typedef unsigned long Unsigned;
unsigned long timeout_t
Typedef for millisecond timer values.
T * init(T *memory)
Template function to initialize memory by invoking default constructor.
void strfree(char *str)
Matching function for strdup().
void(* sighandler_t)(int)
Convenient typedef for signal handlers.