47 changed files with 514 additions and 635 deletions
-
33ext/mysql/libmysql/charset.c
-
3ext/mysql/libmysql/config-win.h
-
6ext/mysql/libmysql/ctype.c
-
181ext/mysql/libmysql/dbug.c
-
2ext/mysql/libmysql/dbug.h
-
6ext/mysql/libmysql/default.c
-
98ext/mysql/libmysql/dll.c
-
28ext/mysql/libmysql/errmsg.c
-
4ext/mysql/libmysql/errmsg.h
-
7ext/mysql/libmysql/get_password.c
-
61ext/mysql/libmysql/global.h
-
89ext/mysql/libmysql/libmysql.c
-
8ext/mysql/libmysql/list.c
-
17ext/mysql/libmysql/m_string.h
-
33ext/mysql/libmysql/mf_casecnv.c
-
2ext/mysql/libmysql/mf_dirname.c
-
2ext/mysql/libmysql/mf_format.c
-
2ext/mysql/libmysql/mf_path.c
-
1ext/mysql/libmysql/my_compress.c
-
4ext/mysql/libmysql/my_create.c
-
14ext/mysql/libmysql/my_getwd.c
-
4ext/mysql/libmysql/my_init.c
-
15ext/mysql/libmysql/my_lib.c
-
2ext/mysql/libmysql/my_malloc.c
-
9ext/mysql/libmysql/my_open.c
-
2ext/mysql/libmysql/my_pthread.c
-
68ext/mysql/libmysql/my_pthread.h
-
2ext/mysql/libmysql/my_realloc.c
-
3ext/mysql/libmysql/my_static.c
-
5ext/mysql/libmysql/my_sys.h
-
27ext/mysql/libmysql/my_tempnam.c
-
6ext/mysql/libmysql/my_thr_init.c
-
128ext/mysql/libmysql/my_wincond.c
-
105ext/mysql/libmysql/my_winthread.c
-
1ext/mysql/libmysql/my_write.c
-
6ext/mysql/libmysql/mysql.h
-
15ext/mysql/libmysql/mysql_com.h
-
10ext/mysql/libmysql/mysql_version.h
-
12ext/mysql/libmysql/mysqld_error.h
-
27ext/mysql/libmysql/net.c
-
2ext/mysql/libmysql/raid.h
-
3ext/mysql/libmysql/strmake.c
-
16ext/mysql/libmysql/strto.c
-
4ext/mysql/libmysql/strtoll.c
-
4ext/mysql/libmysql/strtoull.c
-
2ext/mysql/libmysql/thr_alarm.h
-
70ext/mysql/libmysql/violite.c
@ -1,98 +0,0 @@ |
|||||
/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB |
|
||||
This file is public domain and comes with NO WARRANTY of any kind */ |
|
||||
|
|
||||
/* |
|
||||
** Handling initialization of the dll library |
|
||||
*/ |
|
||||
|
|
||||
#include <global.h> |
|
||||
#include <my_sys.h> |
|
||||
#include <my_pthread.h> |
|
||||
|
|
||||
static bool libmysql_inited=0; |
|
||||
|
|
||||
void libmysql_init(void) |
|
||||
{ |
|
||||
if (libmysql_inited) |
|
||||
return; |
|
||||
libmysql_inited=1; |
|
||||
my_init(); |
|
||||
{ |
|
||||
DBUG_ENTER("libmysql_init"); |
|
||||
#ifdef LOG_ALL |
|
||||
DBUG_PUSH("d:t:S:O,c::\\tmp\\libmysql.log"); |
|
||||
#else |
|
||||
if (getenv("LIBMYSQL_LOG") != NULL) |
|
||||
DBUG_PUSH(getenv("LIBMYSQL_LOG")); |
|
||||
#endif |
|
||||
DBUG_VOID_RETURN; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
#ifdef __WIN__ |
|
||||
|
|
||||
static int inited=0,threads=0; |
|
||||
HINSTANCE NEAR s_hModule; /* Saved module handle */ |
|
||||
DWORD main_thread; |
|
||||
|
|
||||
BOOL APIENTRY LibMain(HANDLE hInst,DWORD ul_reason_being_called, |
|
||||
LPVOID lpReserved) |
|
||||
{ |
|
||||
switch (ul_reason_being_called) { |
|
||||
case DLL_PROCESS_ATTACH: /* case of libentry call in win 3.x */ |
|
||||
if (!inited++) |
|
||||
{ |
|
||||
s_hModule=hInst; |
|
||||
libmysql_init(); |
|
||||
main_thread=GetCurrentThreadId(); |
|
||||
} |
|
||||
break; |
|
||||
case DLL_THREAD_ATTACH: |
|
||||
threads++; |
|
||||
my_thread_init(); |
|
||||
break; |
|
||||
case DLL_PROCESS_DETACH: /* case of wep call in win 3.x */ |
|
||||
if (!--inited) /* Safety */ |
|
||||
{ |
|
||||
/* my_thread_init() */ /* This may give extra safety */ |
|
||||
my_end(0); |
|
||||
} |
|
||||
break; |
|
||||
case DLL_THREAD_DETACH: |
|
||||
/* Main thread will free by my_end() */ |
|
||||
threads--; |
|
||||
if (main_thread != GetCurrentThreadId()) |
|
||||
my_thread_end(); |
|
||||
break; |
|
||||
default: |
|
||||
break; |
|
||||
} /* switch */ |
|
||||
|
|
||||
return TRUE; |
|
||||
|
|
||||
UNREFERENCED_PARAMETER(lpReserved); |
|
||||
} /* LibMain */ |
|
||||
|
|
||||
int __stdcall DllMain(HANDLE hInst,DWORD ul_reason_being_called,LPVOID lpReserved) |
|
||||
{ |
|
||||
return LibMain(hInst,ul_reason_being_called,lpReserved); |
|
||||
} |
|
||||
|
|
||||
#elif defined(WINDOWS) |
|
||||
|
|
||||
/**************************************************************************** |
|
||||
** This routine is called by LIBSTART.ASM at module load time. All it |
|
||||
** does in this sample is remember the DLL module handle. The module |
|
||||
** handle is needed if you want to do things like load stuff from the |
|
||||
** resource file (for instance string resources). |
|
||||
****************************************************************************/ |
|
||||
|
|
||||
int _export FAR PASCAL libmain(HANDLE hModule,short cbHeapSize, |
|
||||
UCHAR FAR *lszCmdLine) |
|
||||
{ |
|
||||
s_hModule = hModule; |
|
||||
libmysql_init(); |
|
||||
return TRUE; |
|
||||
} |
|
||||
|
|
||||
#endif |
|
||||
@ -1,128 +0,0 @@ |
|||||
/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB |
|
||||
This file is public domain and comes with NO WARRANTY of any kind */ |
|
||||
|
|
||||
/***************************************************************************** |
|
||||
** The following is a simple implementation of posix conditions |
|
||||
*****************************************************************************/ |
|
||||
|
|
||||
#undef SAFE_MUTEX /* Avoid safe_mutex redefinitions */ |
|
||||
#include "mysys_priv.h" |
|
||||
#if defined(THREAD) && defined(__WIN__) |
|
||||
#include <m_string.h> |
|
||||
#undef getpid |
|
||||
#include <process.h> |
|
||||
#include <sys/timeb.h> |
|
||||
|
|
||||
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) |
|
||||
{ |
|
||||
cond->waiting=0; |
|
||||
cond->semaphore=CreateSemaphore(NULL,0,0x7FFFFFFF,NullS); |
|
||||
if (!cond->semaphore) |
|
||||
return ENOMEM; |
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
int pthread_cond_destroy(pthread_cond_t *cond) |
|
||||
{ |
|
||||
return CloseHandle(cond->semaphore) ? 0 : EINVAL; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) |
|
||||
{ |
|
||||
InterlockedIncrement(&cond->waiting); |
|
||||
LeaveCriticalSection(mutex); |
|
||||
WaitForSingleObject(cond->semaphore,INFINITE); |
|
||||
InterlockedDecrement(&cond->waiting); |
|
||||
EnterCriticalSection(mutex); |
|
||||
return 0 ; |
|
||||
} |
|
||||
|
|
||||
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, |
|
||||
struct timespec *abstime) |
|
||||
{ |
|
||||
struct _timeb curtime; |
|
||||
int result; |
|
||||
long timeout; |
|
||||
_ftime(&curtime); |
|
||||
timeout= ((long) (abstime->tv_sec - curtime.time)*1000L + |
|
||||
(long)((abstime->tv_nsec/1000) - curtime.millitm)/1000L); |
|
||||
if (timeout < 0) /* Some safety */ |
|
||||
timeout = 0L; |
|
||||
InterlockedIncrement(&cond->waiting); |
|
||||
LeaveCriticalSection(mutex); |
|
||||
result=WaitForSingleObject(cond->semaphore,timeout); |
|
||||
InterlockedDecrement(&cond->waiting); |
|
||||
EnterCriticalSection(mutex); |
|
||||
|
|
||||
return result == WAIT_TIMEOUT ? ETIMEDOUT : 0; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
int pthread_cond_signal(pthread_cond_t *cond) |
|
||||
{ |
|
||||
long prev_count; |
|
||||
if (cond->waiting) |
|
||||
ReleaseSemaphore(cond->semaphore,1,&prev_count); |
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
int pthread_cond_broadcast(pthread_cond_t *cond) |
|
||||
{ |
|
||||
long prev_count; |
|
||||
if (cond->waiting) |
|
||||
ReleaseSemaphore(cond->semaphore,cond->waiting,&prev_count); |
|
||||
return 0 ; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
int pthread_attr_init(pthread_attr_t *connect_att) |
|
||||
{ |
|
||||
connect_att->dwStackSize = 0; |
|
||||
connect_att->dwCreatingFlag = 0; |
|
||||
connect_att->priority = 0; |
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
int pthread_attr_setstacksize(pthread_attr_t *connect_att,DWORD stack) |
|
||||
{ |
|
||||
connect_att->dwStackSize=stack; |
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
int pthread_attr_setprio(pthread_attr_t *connect_att,int priority) |
|
||||
{ |
|
||||
connect_att->priority=priority; |
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
int pthread_attr_destroy(pthread_attr_t *connect_att) |
|
||||
{ |
|
||||
bzero((gptr) connect_att,sizeof(*connect_att)); |
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
/**************************************************************************** |
|
||||
** Fix localtime_r() to be a bit safer |
|
||||
****************************************************************************/ |
|
||||
|
|
||||
struct tm *localtime_r(const time_t *timep,struct tm *tmp) |
|
||||
{ |
|
||||
if (*timep == (time_t) -1) /* This will crash win32 */ |
|
||||
{ |
|
||||
bzero(tmp,sizeof(*tmp)); |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
struct tm *res=localtime(timep); |
|
||||
if (!res) /* Wrong date */ |
|
||||
{ |
|
||||
bzero(tmp,sizeof(*tmp)); /* Keep things safe */ |
|
||||
return 0; |
|
||||
} |
|
||||
*tmp= *res; |
|
||||
} |
|
||||
return tmp; |
|
||||
} |
|
||||
#endif /* __WIN__ */ |
|
||||
@ -1,105 +0,0 @@ |
|||||
/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB |
|
||||
This file is public domain and comes with NO WARRANTY of any kind */ |
|
||||
|
|
||||
/***************************************************************************** |
|
||||
** Simulation of posix threads calls for WIN95 and NT |
|
||||
*****************************************************************************/ |
|
||||
|
|
||||
/* SAFE_MUTEX will not work until the thread structure is up to date */ |
|
||||
#undef SAFE_MUTEX |
|
||||
|
|
||||
#include "mysys_priv.h" |
|
||||
#if defined(THREAD) && defined(__WIN__) |
|
||||
#include <m_string.h> |
|
||||
#undef getpid |
|
||||
#include <process.h> |
|
||||
|
|
||||
static pthread_mutex_t THR_LOCK_thread; |
|
||||
|
|
||||
struct pthread_map |
|
||||
{ |
|
||||
HANDLE pthreadself; |
|
||||
pthread_handler func; |
|
||||
void *param; |
|
||||
}; |
|
||||
|
|
||||
void win_pthread_init(void) |
|
||||
{ |
|
||||
pthread_mutex_init(&THR_LOCK_thread,MY_MUTEX_INIT_FAST); |
|
||||
} |
|
||||
|
|
||||
/* |
|
||||
** We have tried to use '_beginthreadex' instead of '_beginthread' here |
|
||||
** but in this case the program leaks about 512 characters for each |
|
||||
** created thread ! |
|
||||
** As we want to save the created thread handler for other threads to |
|
||||
** use and to be returned by pthread_self() (instead of the Win32 pseudo |
|
||||
** handler), we have to go trough pthread_start() to catch the returned handler |
|
||||
** in the new thread. |
|
||||
*/ |
|
||||
|
|
||||
static pthread_handler_decl(pthread_start,param) |
|
||||
{ |
|
||||
pthread_handler func=((struct pthread_map *) param)->func; |
|
||||
void *func_param=((struct pthread_map *) param)->param; |
|
||||
my_thread_init(); /* Will always succeed in windows */ |
|
||||
pthread_mutex_lock(&THR_LOCK_thread); /* Wait for beginthread to return */ |
|
||||
win_pthread_self=((struct pthread_map *) param)->pthreadself; |
|
||||
pthread_mutex_unlock(&THR_LOCK_thread); |
|
||||
free((char*) param); /* Free param from create */ |
|
||||
pthread_exit((void*) (*func)(func_param)); |
|
||||
return 0; /* Safety */ |
|
||||
} |
|
||||
|
|
||||
|
|
||||
int pthread_create(pthread_t *thread_id, pthread_attr_t *attr, |
|
||||
pthread_handler func, void *param) |
|
||||
{ |
|
||||
HANDLE hThread; |
|
||||
struct pthread_map *map; |
|
||||
DBUG_ENTER("pthread_create"); |
|
||||
|
|
||||
if (!(map=malloc(sizeof(*map)))) |
|
||||
DBUG_RETURN(-1); |
|
||||
map->func=func; |
|
||||
map->param=param; |
|
||||
pthread_mutex_lock(&THR_LOCK_thread); |
|
||||
#ifdef __BORLANDC__ |
|
||||
hThread=(HANDLE)_beginthread((void(_USERENTRY *)(void *)) pthread_start, |
|
||||
attr->dwStackSize ? attr->dwStackSize : |
|
||||
65535, (void*) map); |
|
||||
#else |
|
||||
hThread=(HANDLE)_beginthread((void( __cdecl *)(void *)) pthread_start, |
|
||||
attr->dwStackSize ? attr->dwStackSize : |
|
||||
65535, (void*) map); |
|
||||
#endif |
|
||||
DBUG_PRINT("info", ("hThread=%lu",(long) hThread)); |
|
||||
*thread_id=map->pthreadself=hThread; |
|
||||
pthread_mutex_unlock(&THR_LOCK_thread); |
|
||||
|
|
||||
if (hThread == (HANDLE) -1) |
|
||||
{ |
|
||||
int error=errno; |
|
||||
DBUG_PRINT("error", |
|
||||
("Can't create thread to handle request (error %d)",error)); |
|
||||
DBUG_RETURN(error ? error : -1); |
|
||||
} |
|
||||
VOID(SetThreadPriority(hThread, attr->priority)) ; |
|
||||
DBUG_RETURN(0); |
|
||||
} |
|
||||
|
|
||||
|
|
||||
void pthread_exit(void *a) |
|
||||
{ |
|
||||
_endthread(); |
|
||||
} |
|
||||
|
|
||||
/* This is neaded to get the macro pthread_setspecific to work */ |
|
||||
|
|
||||
int win_pthread_setspecific(void *a,void *b,uint length) |
|
||||
{ |
|
||||
memcpy(a,b,length); |
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
#endif |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue