00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00027 #ifndef _UCOMMON_PLATFORM_H_
00028 #define _UCOMMON_PLATFORM_H_
00029 #define UCOMMON_ABI 5
00030
00041 #define UCOMMON_NAMESPACE ucommon
00042 #define NAMESPACE_UCOMMON namespace ucommon {
00043 #define END_NAMESPACE }
00044
00045 #ifndef _REENTRANT
00046 #define _REENTRANT 1
00047 #endif
00048
00049 #ifndef __PTH__
00050 #ifndef _THREADSAFE
00051 #define _THREADSAFE 1
00052 #endif
00053
00054 #ifndef _POSIX_PTHREAD_SEMANTICS
00055 #define _POSIX_PTHREAD_SEMANTICS
00056 #endif
00057 #endif
00058
00059 #if defined(__GNUC__) && (__GNUC < 3) && !defined(_GNU_SOURCE)
00060 #define _GNU_SOURCE
00061 #endif
00062
00063 #if __GNUC__ > 3 || (__GNUC__ == 3 && (__GNU_MINOR__ > 3))
00064 #define __PRINTF(x,y) __attribute__ ((format (printf, x, y)))
00065 #define __SCANF(x, y) __attribute__ ((format (scanf, x, y)))
00066 #define __MALLOC __attribute__ ((malloc))
00067 #endif
00068
00069 #ifndef __MALLOC
00070 #define __PRINTF(x, y)
00071 #define __SCANF(x, y)
00072 #define __MALLOC
00073 #endif
00074
00075 #ifndef DEBUG
00076 #ifndef NDEBUG
00077 #define NDEBUG
00078 #endif
00079 #endif
00080
00081 #ifdef DEBUG
00082 #ifdef NDEBUG
00083 #undef NDEBUG
00084 #endif
00085 #endif
00086
00087
00088
00089 #if defined(NEW_STDCPP) || defined(OLD_STDCPP)
00090 #define _UCOMMON_EXTENDED_
00091 #endif
00092
00093
00094
00095 #if defined(_MSC_VER) || defined(WIN32) || defined(_WIN32)
00096 #define _MSWINDOWS_
00097
00098 #if defined(_M_X64) || defined(_M_ARM)
00099 #define _MSCONDITIONALS_
00100 #ifndef _WIN32_WINNT 0x0600
00101 #define _WIN32_WINNT
00102 #endif
00103 #endif
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 #pragma warning(disable: 4251)
00115 #pragma warning(disable: 4996)
00116 #pragma warning(disable: 4355)
00117 #pragma warning(disable: 4290)
00118 #pragma warning(disable: 4291)
00119
00120 #if defined(__BORLANDC__) && !defined(__MT__)
00121 #error Please enable multithreading
00122 #endif
00123
00124 #if defined(_MSC_VER) && !defined(_MT)
00125 #error Please enable multithreading (Project -> Settings -> C/C++ -> Code Generation -> Use Runtime Library)
00126 #endif
00127
00128
00129 #ifndef _WIN32_WINNT
00130 #define _WIN32_WINNT 0x0501
00131 #endif
00132
00133
00134 #ifndef WINVER
00135 #define WINVER _WIN32_WINNT
00136 #endif
00137
00138 #ifndef WIN32_LEAN_AND_MEAN
00139 #define WIN32_LEAN_AND_MEAN
00140 #endif
00141
00142 #include <winsock2.h>
00143 #include <ws2tcpip.h>
00144
00145 #if defined(_MSC_VER)
00146 typedef signed long ssize_t;
00147 typedef int pid_t;
00148 #endif
00149
00150 #include <process.h>
00151 #ifndef __EXPORT
00152 #ifdef UCOMMON_STATIC
00153 #define __EXPORT
00154 #else
00155 #define __EXPORT __declspec(dllimport)
00156 #endif
00157 #endif
00158 #define __LOCAL
00159 #elif UCOMMON_VISIBILITY > 0
00160 #define __EXPORT __attribute__ ((visibility("default")))
00161 #define __LOCAL __attribute__ ((visibility("hidden")))
00162 #else
00163 #define __EXPORT
00164 #define __LOCAL
00165 #endif
00166
00167 #ifdef _MSWINDOWS_
00168
00169 #define _UWIN
00170
00171 #include <sys/stat.h>
00172 #include <io.h>
00173
00174 typedef DWORD pthread_t;
00175 typedef CRITICAL_SECTION pthread_mutex_t;
00176 typedef char *caddr_t;
00177 typedef HANDLE fd_t;
00178 typedef SOCKET socket_t;
00179
00180 typedef struct timespec {
00181 time_t tv_sec;
00182 long tv_nsec;
00183 } timespec_t;
00184
00185 extern "C" {
00186
00187 #define SERVICE_MAIN(id, argc, argv) void WINAPI service_##id(DWORD argc, LPSTR *argv)
00188
00189 typedef LPSERVICE_MAIN_FUNCTION cpr_service_t;
00190
00191 __EXPORT int cpr_setenv(const char *s, const char *v, int p);
00192
00193 inline int setenv(const char *s, const char *v, int overwrite)
00194 {return cpr_setenv(s, v, overwrite);};
00195
00196 inline void sleep(int seconds)
00197 {::Sleep((seconds * 1000l));};
00198
00199 inline void pthread_exit(void *p)
00200 {_endthreadex((DWORD)p);};
00201
00202 inline pthread_t pthread_self(void)
00203 {return (pthread_t)GetCurrentThreadId();};
00204
00205 inline int pthread_mutex_init(pthread_mutex_t *mutex, void *x)
00206 {InitializeCriticalSection(mutex); return 0;};
00207
00208 inline void pthread_mutex_destroy(pthread_mutex_t *mutex)
00209 {DeleteCriticalSection(mutex);};
00210
00211 inline void pthread_mutex_lock(pthread_mutex_t *mutex)
00212 {EnterCriticalSection(mutex);};
00213
00214 inline void pthread_mutex_unlock(pthread_mutex_t *mutex)
00215 {LeaveCriticalSection(mutex);};
00216
00217 inline char *strdup(const char *s)
00218 {return _strdup(s);};
00219
00220 inline int stricmp(const char *s1, const char *s2)
00221 {return _stricmp(s1, s2);};
00222
00223 inline int strnicmp(const char *s1, const char *s2, size_t l)
00224 {return _strnicmp(s1, s2, l);};
00225 };
00226
00227 #elif defined(__PTH__)
00228
00229 #include <pth.h>
00230 #include <sys/wait.h>
00231
00232 typedef int socket_t;
00233 typedef int fd_t;
00234 #define INVALID_SOCKET -1
00235 #define INVALID_HANDLE_VALUE -1
00236 #include <signal.h>
00237
00238 #define pthread_mutex_t pth_mutex_t
00239 #define pthread_cond_t pth_cond_t
00240 #define pthread_t pth_t
00241
00242 inline int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset)
00243 {return pth_sigmask(how, set, oset);};
00244
00245 inline void pthread_exit(void *p)
00246 {pth_exit(p);};
00247
00248 inline void pthread_kill(pthread_t tid, int sig)
00249 {pth_raise(tid, sig);};
00250
00251 inline int pthread_mutex_init(pthread_mutex_t *mutex, void *x)
00252 {return pth_mutex_init(mutex) != 0;};
00253
00254 inline void pthread_mutex_destroy(pthread_mutex_t *mutex)
00255 {};
00256
00257 inline void pthread_mutex_lock(pthread_mutex_t *mutex)
00258 {pth_mutex_acquire(mutex, 0, NULL);};
00259
00260 inline void pthread_mutex_unlock(pthread_mutex_t *mutex)
00261 {pth_mutex_release(mutex);};
00262
00263 inline void pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
00264 {pth_cond_await(cond, mutex, NULL);};
00265
00266 inline void pthread_cond_signal(pthread_cond_t *cond)
00267 {pth_cond_notify(cond, FALSE);};
00268
00269 inline void pthread_cond_broadcast(pthread_cond_t *cond)
00270 {pth_cond_notify(cond, TRUE);};
00271
00272 #else
00273
00274 #include <pthread.h>
00275
00276 typedef int socket_t;
00277 typedef int fd_t;
00278 #define INVALID_SOCKET -1
00279 #define INVALID_HANDLE_VALUE -1
00280 #include <signal.h>
00281
00282 #endif
00283
00284 #ifdef _MSC_VER
00285 typedef signed __int8 int8_t;
00286 typedef unsigned __int8 uint8_t;
00287 typedef signed __int16 int16_t;
00288 typedef unsigned __int16 uint16_t;
00289 typedef signed __int32 int32_t;
00290 typedef unsigned __int32 uint32_t;
00291 typedef signed __int64 int64_t;
00292 typedef unsigned __int64 uint64_t;
00293 typedef char *caddr_t;
00294
00295 #include <stdio.h>
00296 #define snprintf _snprintf
00297 #define vsnprintf _vsnprintf
00298
00299 #else
00300
00301 #include <sys/stat.h>
00302 #include <sys/types.h>
00303 #include <stdint.h>
00304 #include <unistd.h>
00305
00306 #endif
00307
00308 #ifndef _GNU_SOURCE
00309 typedef void (*sighandler_t)(int);
00310 #endif
00311 typedef unsigned long timeout_t;
00313 #include <stdlib.h>
00314 #include <errno.h>
00315
00316 #ifdef _MSWINDOWS_
00317 #ifndef ENETDOWN
00318 #define ENETDOWN ((int)(WSAENETDOWN))
00319 #endif
00320 #ifndef EINPROGRESS
00321 #define EINPROGRESS ((int)(WSAEINPROGRESS))
00322 #endif
00323 #ifndef ENOPROTOOPT
00324 #define ENOPROTOOPT ((int)(WSAENOPROTOOPT))
00325 #endif
00326 #ifndef EADDRINUSE
00327 #define EADDRINUSE ((int)(WSAEADDRINUSE))
00328 #endif
00329 #ifndef EADDRNOTAVAIL
00330 #define EADDRNOTAVAIL ((int)(WSAEADDRNOTAVAIL))
00331 #endif
00332 #ifndef ENETUNREACH
00333 #define ENETUNREACH ((int)(WSAENETUNREACH))
00334 #endif
00335 #ifndef EHOSTUNREACH
00336 #define EHOSTUNREACH ((int)(WSAEHOSTUNREACH))
00337 #endif
00338 #ifndef EHOSTDOWN
00339 #define EHOSTDOWN ((int)(WSAEHOSTDOWN))
00340 #endif
00341 #ifndef ENETRESET
00342 #define ENETRESET ((int)(WSAENETRESET))
00343 #endif
00344 #ifndef ECONNABORTED
00345 #define ECONNABORTED ((int)(WSAECONNABORTED))
00346 #endif
00347 #ifndef ECONNRESET
00348 #define ECONNRESET ((int)(WSAECONNRESET))
00349 #endif
00350 #ifndef EISCONN
00351 #define EISCONN ((int)(WSAEISCONN))
00352 #endif
00353 #ifndef ENOTCONN
00354 #define ENOTCONN ((int)(WSAENOTCONN))
00355 #endif
00356 #ifndef ESHUTDOWN
00357 #define ESHUTDOWN ((int)(WSAESHUTDOWN))
00358 #endif
00359 #ifndef ETIMEDOUT
00360 #define ETIMEDOUT ((int)(WSAETIMEDOUT))
00361 #endif
00362 #ifndef ECONNREFUSED
00363 #define ECONNREFUSED ((int)(WSAECONNREFUSED))
00364 #endif
00365 #endif
00366
00373 __EXPORT void cpr_runtime_error(const char *text);
00374
00381 extern "C" __EXPORT void *cpr_memalloc(size_t size) __MALLOC;
00382
00392 extern "C" __EXPORT void *cpr_memassign(size_t size, caddr_t address, size_t known) __MALLOC;
00393
00400 extern "C" __EXPORT void cpr_memswap(void *mem1, void *mem2, size_t size);
00401
00402 #ifndef _UCOMMON_EXTENDED_
00403
00408 inline void *operator new(size_t size)
00409 {return cpr_memalloc(size);}
00410
00416 inline void *operator new[](size_t size)
00417 {return cpr_memalloc(size);}
00418 #endif
00419
00420 #ifndef _UCOMMON_EXTENDED_
00421
00429 inline void *operator new[](size_t size, caddr_t address)
00430 {return cpr_memassign(size, address, size);}
00431
00441 inline void *operator new[](size_t size, caddr_t address, size_t known)
00442 {return cpr_memassign(size, address, known);}
00443 #endif
00444
00454 inline void *operator new(size_t size, size_t extra)
00455 {return cpr_memalloc(size + extra);}
00456
00465 inline void *operator new(size_t size, caddr_t address)
00466 {return cpr_memassign(size, address, size);}
00467
00478 inline void *operator new(size_t size, caddr_t address, size_t known)
00479 {return cpr_memassign(size, address, known);}
00480
00481 #ifndef _UCOMMON_EXTENDED_
00482
00486 inline void operator delete(void *object)
00487 {free(object);}
00488
00493 inline void operator delete[](void *array)
00494 {free(array);}
00495
00496 #ifdef __GNUC__
00497 extern "C" __EXPORT void __cxa_pure_virtual(void);
00498 #endif
00499 #endif
00500
00501 #ifndef DEBUG
00502 #ifndef NDEBUG
00503 #define NDEBUG
00504 #endif
00505 #endif
00506
00507 #ifdef DEBUG
00508 #ifdef NDEBUG
00509 #undef NDEBUG
00510 #endif
00511 #endif
00512
00513 #ifndef PROGRAM_MAIN
00514 #define PROGRAM_MAIN(argc, argv) extern "C" int main(int argc, char **argv)
00515 #define PROGRAM_EXIT(code) return code
00516 #endif
00517
00518 #ifndef SERVICE_MAIN
00519 #define SERVICE_MAIN(id, argc, argv) void service_##id(int argc, char **argv)
00520 typedef void (*cpr_service_t)(int argc, char **argv);
00521 #endif
00522
00523 #include <assert.h>
00524 #ifdef DEBUG
00525 #define crit(x, text) assert(x)
00526 #else
00527 #define crit(x, text) if(!(x)) cpr_runtime_error(text)
00528 #endif
00529
00536 template<class T>
00537 inline T *init(T *memory)
00538 {return ((memory) ? new(((caddr_t)memory)) T : NULL);}
00539
00540 extern "C" {
00541
00542 __EXPORT uint16_t lsb_getshort(uint8_t *b);
00543 __EXPORT uint32_t lsb_getlong(uint8_t *b);
00544 __EXPORT uint16_t msb_getshort(uint8_t *b);
00545 __EXPORT uint32_t msb_getlong(uint8_t *b);
00546
00547 __EXPORT void lsb_setshort(uint8_t *b, uint16_t v);
00548 __EXPORT void lsb_setlong(uint8_t *b, uint32_t v);
00549 __EXPORT void msb_setshort(uint8_t *b, uint16_t v);
00550 __EXPORT void msb_setlong(uint8_t *b, uint32_t v);
00551
00552 }
00553
00554 typedef long Integer;
00555 typedef unsigned long Unsigned;
00556 typedef double Real;
00557
00558 #endif