?? my_pthread.h
字號:
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA *//* Defines to make different thread packages compatible */#ifndef _my_pthread_h#define _my_pthread_h#include <errno.h>#ifndef ETIME#define ETIME ETIMEDOUT // For FreeBSD#endif#if defined(__WIN__)typedef CRITICAL_SECTION pthread_mutex_t;typedef HANDLE pthread_t;typedef struct thread_attr { DWORD dwStackSize ; DWORD dwCreatingFlag ; int priority ;} pthread_attr_t ;typedef struct { int dummy; } pthread_condattr_t;/* Implementation of posix conditions */typedef struct st_pthread_link { DWORD thread_id; struct st_pthread_link *next;} pthread_link;typedef struct { uint32 waiting; HANDLE semaphore;} pthread_cond_t;struct timespec { /* For pthread_cond_timedwait() */ time_t tv_sec; long tv_nsec;};typedef int pthread_mutexattr_t;#define win_pthread_self my_thread_var->pthread_self#define pthread_handler_decl(A,B) unsigned __cdecl A(void *B)typedef unsigned (__cdecl *pthread_handler)(void *);void win_pthread_init(void);int win_pthread_setspecific(void *A,void *B,uint length);int pthread_create(pthread_t *,pthread_attr_t *,pthread_handler,void *);int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, struct timespec *abstime);int pthread_cond_signal(pthread_cond_t *cond);int pthread_cond_broadcast(pthread_cond_t *cond);int pthread_cond_destroy(pthread_cond_t *cond);int pthread_attr_init(pthread_attr_t *connect_att);int pthread_attr_setstacksize(pthread_attr_t *connect_att,DWORD stack);int pthread_attr_setprio(pthread_attr_t *connect_att,int priority);int pthread_attr_destroy(pthread_attr_t *connect_att);struct tm *localtime_r(const time_t *timep,struct tm *tmp);void pthread_exit(unsigned A); /* was #define pthread_exit(A) ExitThread(A)*/#define ETIMEDOUT 145 /* Win32 doesn't have this */#define getpid() GetCurrentThreadId()#define pthread_self() win_pthread_self#define HAVE_LOCALTIME_R#define _REENTRANT#define HAVE_PTHREAD_ATTR_SETSTACKSIZE#ifdef USE_TLS /* For LIBMYSQL.DLL */#undef SAFE_MUTEX /* This will cause conflicts */#define pthread_key(T,V) DWORD V#define pthread_key_create(A,B) ((*A=TlsAlloc())==0xFFFFFFFF)#define pthread_getspecific(A) (TlsGetValue(A))#define my_pthread_getspecific(T,A) ((T) TlsGetValue(A))#define my_pthread_getspecific_ptr(T,V) ((T) TlsGetValue(A))#define my_pthread_setspecific_ptr(T,V) TlsSetValue(T,V)#define pthread_setspecific(A,B) TlsSetValue(A,B)#else#define pthread_key(T,V) __declspec(thread) T V#define pthread_key_create(A,B) pthread_dummy(0)#define pthread_getspecific(A) (&(A))#define my_pthread_getspecific(T,A) (&(A))#define my_pthread_getspecific_ptr(T,V) (V)#define my_pthread_setspecific_ptr(T,V) ((T)=(V),0)#define pthread_setspecific(A,B) win_pthread_setspecific(&(A),(B),sizeof(A))#endif /* USE_TLS */#define pthread_equal(A,B) ((A) == (B))#define pthread_mutex_init(A,B) InitializeCriticalSection(A)#define pthread_mutex_lock(A) (EnterCriticalSection(A),0)#define pthread_mutex_unlock(A) LeaveCriticalSection(A)#define pthread_mutex_destroy(A) DeleteCriticalSection(A)#define my_pthread_setprio(A,B) SetThreadPriority(GetCurrentThread(), (B))/* Dummy defines for easier code */#define pthread_kill(A,B) pthread_dummy(0)#define pthread_attr_setdetachstate(A,B) pthread_dummy(0)#define my_pthread_attr_setprio(A,B) pthread_attr_setprio(A,B)#define pthread_attr_setscope(A,B)#define pthread_detach_this_thread()#define pthread_condattr_init(A)#define pthread_condattr_destroy(A)//Irena: compiler does not like this://#define my_pthread_getprio(pthread_t thread_id) pthread_dummy(0)#define my_pthread_getprio(thread_id) pthread_dummy(0)#elif defined(HAVE_UNIXWARE7_THREADS)#include <thread.h>#include <synch.h>#ifndef _REENTRANT#define _REENTRANT#endif#define HAVE_NONPOSIX_SIGWAIT#define pthread_t thread_t#define pthread_cond_t cond_t#define pthread_mutex_t mutex_t#define pthread_key_t thread_key_ttypedef int pthread_attr_t; /* Needed by Unixware 7.0.0 */#define pthread_key_create(A,B) thr_keycreate((A),(B))#define pthread_handler_decl(A,B) void *A(void *B)#define pthread_key(T,V) pthread_key_t Vvoid * my_pthread_getspecific_imp(pthread_key_t key);#define my_pthread_getspecific(A,B) ((A) my_pthread_getspecific_imp(B))#define my_pthread_getspecific_ptr(T,V) my_pthread_getspecific(T,V)#define pthread_setspecific(A,B) thr_setspecific(A,B)#define my_pthread_setspecific_ptr(T,V) pthread_setspecific(T,V)#define pthread_create(A,B,C,D) thr_create(NULL,65536L,(C),(D),THR_DETACHED,(A))#define pthread_cond_init(a,b) cond_init((a),USYNC_THREAD,NULL)#define pthread_cond_destroy(a) cond_destroy(a)#define pthread_cond_signal(a) cond_signal(a)#define pthread_cond_wait(a,b) cond_wait((a),(b))#define pthread_cond_timedwait(a,b,c) cond_timedwait((a),(b),(c))#define pthread_cond_broadcast(a) cond_broadcast(a)#define pthread_mutex_init(a,b) mutex_init((a),USYNC_THREAD,NULL)#define pthread_mutex_lock(a) mutex_lock(a)#define pthread_mutex_unlock(a) mutex_unlock(a)#define pthread_mutex_destroy(a) mutex_destroy(a)#define pthread_self() thr_self()#define pthread_exit(A) thr_exit(A)#define pthread_equal(A,B) (((A) == (B)) ? 1 : 0)#define pthread_kill(A,B) thr_kill((A),(B))#define HAVE_PTHREAD_KILL#define pthread_sigmask(A,B,C) thr_sigsetmask((A),(B),(C))extern int my_sigwait(const sigset_t *set,int *sig);#define pthread_detach_this_thread() pthread_dummy(0)#define pthread_attr_init(A) pthread_dummy(0)#define pthread_attr_destroy(A) pthread_dummy(0)#define pthread_attr_setscope(A,B) pthread_dummy(0)#define pthread_attr_setdetachstate(A,B) pthread_dummy(0)#define my_pthread_setprio(A,B) pthread_dummy (0)#define my_pthread_getprio(A) pthread_dummy (0)#define my_pthread_attr_setprio(A,B) pthread_dummy(0)#else /* Normal threads */#ifdef HAVE_rts_threads#define sigwait org_sigwait#include <signal.h>#undef sigwait#endif#undef _REENTRANT /* Fix if _REENTRANT is in pthread.h */#include <pthread.h>#ifndef _REENTRANT#define _REENTRANT#endif#ifdef HAVE_THR_SETCONCURRENCY#include <thread.h> /* Probably solaris */#endif#ifdef HAVE_SCHED_H#include <sched.h>#endif#ifdef HAVE_SYNCH_H#include <synch.h>#endif#if defined(__EMX__) && (!defined(EMX_PTHREAD_REV) || (EMX_PTHREAD_REV < 2))#error Requires at least rev 2 of EMX pthreads library.#endifextern int my_pthread_getprio(pthread_t thread_id);#define pthread_key(T,V) pthread_key_t V#define my_pthread_getspecific_ptr(T,V) my_pthread_getspecific(T,(V))#define my_pthread_setspecific_ptr(T,V) pthread_setspecific(T,(void*) (V))#define pthread_detach_this_thread()#define pthread_handler_decl(A,B) void *A(void *B)typedef void *(* pthread_handler)(void *);/* Test first for RTS or FSU threads */#if defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM)#define HAVE_rts_threadsextern int my_pthread_create_detached;#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))#define PTHREAD_CREATE_DETACHED &my_pthread_create_detached#define PTHREAD_SCOPE_SYSTEM PTHREAD_SCOPE_GLOBAL#define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_LOCAL#define USE_ALARM_THREAD#elif defined(HAVE_mit_thread)#define USE_ALARM_THREAD#undef HAVE_LOCALTIME_R#define HAVE_LOCALTIME_R#undef HAVE_PTHREAD_ATTR_SETSCOPE#define HAVE_PTHREAD_ATTR_SETSCOPE#undef HAVE_GLIBC2_STYLE_GETHOSTBYNAME_R /* If we are running linux */#undef HAVE_RWLOCK_T#undef HAVE_RWLOCK_INIT#undef HAVE_PTHREAD_RWLOCK_RDLOCK#undef HAVE_SNPRINTF#define sigset(A,B) pthread_signal((A),(void (*)(int)) (B))#define signal(A,B) pthread_signal((A),(void (*)(int)) (B))#define my_pthread_attr_setprio(A,B)#endif /* defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM) */#if defined(_BSDI_VERSION) && _BSDI_VERSION < 199910int sigwait(sigset_t *set, int *sig);#endif#if defined(HAVE_UNIXWARE7_POSIX)#undef HAVE_NONPOSIX_SIGWAIT#define HAVE_NONPOSIX_SIGWAIT /* sigwait takes only 1 argument */#endif#ifndef HAVE_NONPOSIX_SIGWAIT#define my_sigwait(A,B) sigwait((A),(B))#elseint my_sigwait(const sigset_t *set,int *sig);#endif#ifdef HAVE_NONPOSIX_PTHREAD_MUTEX_INIT#ifndef SAFE_MUTEX#define pthread_mutex_init(a,b) my_pthread_mutex_init((a),(b))extern int my_pthread_mutex_init(pthread_mutex_t *mp, const pthread_mutexattr_t *attr);#endif /* SAFE_MUTEX */#define pthread_cond_init(a,b) my_pthread_cond_init((a),(b))extern int my_pthread_cond_init(pthread_cond_t *mp, const pthread_condattr_t *attr);#endif /* HAVE_NONPOSIX_PTHREAD_MUTEX_INIT */#if defined(HAVE_SIGTHREADMASK) && !defined(HAVE_PTHREAD_SIGMASK)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -