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