#ifdef DECLARE_POINTERS #define FEXTERN #else #define FEXTERN extern #endif #include #define pthread_create sopthread_create #define pthread_exit sopthread_exit #define pthread_detach sopthread_detach #define pthread_self sopthread_self typedef int (*pthread_create_fp)(pthread_t *__threadx, __const pthread_attr_t *__attr, void *(*__start_routine)(void *), void *__arg); FEXTERN pthread_create_fp sopthread_create; typedef void (*pthread_exit_fp)(void *__retval); FEXTERN pthread_exit_fp sopthread_exit; typedef int (*pthread_detach_fp)(pthread_t __th); FEXTERN pthread_detach_fp sopthread_detach; typedef pthread_t (*pthread_self_fp)(void); FEXTERN pthread_self_fp sopthread_self; #ifndef DECLARE_POINTERS bool LoadPThreadLib(bool load = true); #else #include #include #include void LoadPThreadLibSetNULL(void) { sopthread_create = NULL; sopthread_exit = NULL; sopthread_detach = NULL; sopthread_self = NULL; } bool LoadPThreadLib(bool load) { #define PTHREADLIB "libpthread.so" static void *handle = NULL; if (!load) { LoadPThreadLibSetNULL(); if (handle) { dlclose(handle); handle = NULL; return true; } fprintf(stderr, "Library Unload Failed: %s\n", PTHREADLIB); return false; } if (handle) return true; // Load the library handle = dlopen(PTHREADLIB, RTLD_LAZY | RTLD_GLOBAL); if (!handle) { fprintf(stderr, "Library Load Failed: %s\n", PTHREADLIB); return false; } sopthread_create = (pthread_create_fp)dlsym(handle, "pthread_create"); if (!sopthread_create) goto load_error; sopthread_exit = (pthread_exit_fp)dlsym(handle, "pthread_exit"); if (!sopthread_exit) goto load_error; sopthread_detach = (pthread_detach_fp)dlsym(handle, "pthread_detach"); if (!sopthread_detach) goto load_error; sopthread_self = (pthread_self_fp)dlsym(handle, "pthread_self"); if (!sopthread_self) goto load_error; return true; load_error: LoadPThreadLibSetNULL(); fprintf(stderr, "Library Symbol Resolve Error: %s\n", PTHREADLIB); dlclose(handle); handle = NULL; return false; } #endif