mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
ce8de7afdf
-new option WITH_MARIA_STORAGE_ENGINE for config.js -correct build errors -build test executables -downport changes for atomic functions from 5.2 -remove LOCK_uuid_generator from C++ files to avoid linker errors -new function my_uuid2str() BitKeeper/deleted/.del-x86-msvc.h: Delete: include/atomic/x86-msvc.h CMakeLists.txt: Windows fixes: -New option WITH_MARIA_STORAGE_ENGINE -Add unit tests include/Makefile.am: replace x86-msvc.h with generic-msvc.h include/config-win.h: my_chmod() support include/my_atomic.h: Downport my_atomic from 5.2 tree include/my_bit.h: Correct unresolved symbol errors on Windows include/my_pthread.h: pthread_mutex_unlock now returns 0 (was void previously) defined PTHREAD_STACK_MIN include/my_sys.h: New function my_uuid2str() define MY_UUID_STRING_LENGTH include/atomic/nolock.h: Downport my_atomic from 5.2 tree libmysqld/CMakeLists.txt: New option WITH_MARIA_STORAGE_ENGINE mysys/CMakeLists.txt: Add missing files mysys/lf_dynarray.c: Fix compiler errors on Windows mysys/my_getncpus.c: Windows port mysys/my_uuid.c: Windows fixes: there is no random() on Windows, use ANSI rand() New function my_uuid2str() mysys/my_winthread.c: Downport from 5.2 tree -Call my_thread_end() before pthread_exit() -Avoid crash if pthread_create is called with NULL attributes sql/CMakeLists.txt: Link mysqld with Maria storage engine sql/item_func.cc: Remove LOCK_uuid_generator from C++ to avoid linker errors. Use dedicated mutex for short uuids sql/item_strfunc.cc: Use my_uuid() and my_uuid2str() functions from mysys. sql/item_strfunc.h: Define MY_UUID_STRING_LENGTH in my_sys.h sql/mysql_priv.h: LOCK_uuid_generator must be declared as extern "C" sql/mysqld.cc: Init and destroy LOCK_uuid_short mutex storage/maria/CMakeLists.txt: -Use the same source files as in Makefile.am -Build test binaries storage/maria/ha_maria.cc: snprintf->my_snprintf storage/maria/lockman.c: Fix compiler error on Windows storage/maria/ma_check.c: Fix compiler error on Windows storage/maria/ma_loghandler.c: Fix compile errors my_open()/my_sync() do not work for directories on Windows storage/maria/ma_recovery.c: Fix compile error on Windows storage/maria/ma_test2.c: Rename variable to avoid naming conflict with Microsoft C runtime function storage/maria/ma_test3.c: Fix build errors on Windows storage/maria/tablockman.c: Fix build errors on Windows storage/maria/unittest/Makefile.am: Add CMakeLists.txt storage/maria/unittest/ma_pagecache_consist.c: Fix build errors on Windows remove loop from get_len() storage/maria/unittest/ma_pagecache_single.c: Fix build errors on Windows storage/maria/unittest/ma_test_loghandler-t.c: Windows fixes -Avoid division by 0 in expressions like x/(RAND_MAX/y), where y is larger than RAND_MAX(==0x7fff on Windows) storage/maria/unittest/ma_test_loghandler_multigroup-t.c: Windows fixes -Avoid division by 0 in expressions like x/(RAND_MAX/y), where y is larger than RAND_MAX(==0x7fff on Windows) -remove loop in get_len() storage/maria/unittest/ma_test_loghandler_multithread-t.c: Windows fixes -Avoid division by 0 in expressions like x/(RAND_MAX/y), where y is larger than RAND_MAX(==0x7fff on Windows) -remove loop in get_len() storage/maria/unittest/ma_test_loghandler_noflush-t.c: Fix build errors on Windows storage/maria/unittest/test_file.c: Correct the code to get file size on Windows. stat() information can be outdated and thus cannot be trusted. On Vista,stat() returns file size=0 until the file is closed at the first time. storage/myisam/CMakeLists.txt: Fix compiler errors on Windows Build test executables storage/myisam/mi_test2.c: Rename variable to avoid naming conflict with Microsoft C runtime function storage/myisam/mi_test3.c: Fix build errors on Windows strings/CMakeLists.txt: Add missing file unittest/unit.pl: Windows: downport unittest changes from 5.2 bk tree unittest/mysys/Makefile.am: Windows: downport unittest changes from 5.2 bk tree unittest/mysys/my_atomic-t.c: Windows: downport unittest changes from 5.2 bk tree unittest/mytap/Makefile.am: Windows: downport unittest changes from 5.2 bk tree unittest/mytap/tap.c: Windows: downport unittest changes from 5.2 bk tree win/configure.js: Add WITH_MARIA_STORAGE_ENGINE configure option unittest/mytap/CMakeLists.txt: Add missing file unittest/mysys/CMakeLists.txt: Add missing file storage/maria/unittest/CMakeLists.txt: Add missing file BitKeeper/etc/ignore: Added comments maria-win.patch to the ignore list include/atomic/generic-msvc.h: Implement atomic operations with MSVC intrinsics
150 lines
4 KiB
C
150 lines
4 KiB
C
/* Copyright (C) 2000 MySQL AB
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program 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 General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
/*****************************************************************************
|
|
** 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);
|
|
}
|
|
|
|
|
|
/**
|
|
Adapter to @c pthread_mutex_trylock()
|
|
|
|
@retval 0 Mutex was acquired
|
|
@retval EBUSY Mutex was already locked by a thread
|
|
*/
|
|
int
|
|
win_pthread_mutex_trylock(pthread_mutex_t *mutex)
|
|
{
|
|
if (TryEnterCriticalSection(mutex))
|
|
{
|
|
/* Don't allow recursive lock */
|
|
if (mutex->RecursionCount > 1){
|
|
LeaveCriticalSection(mutex);
|
|
return EBUSY;
|
|
}
|
|
return 0;
|
|
}
|
|
return EBUSY;
|
|
}
|
|
|
|
|
|
/*
|
|
** 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.
|
|
*/
|
|
|
|
pthread_handler_t pthread_start(void *param)
|
|
{
|
|
pthread_handler func=((struct pthread_map *) param)->func;
|
|
void *func_param=((struct pthread_map *) param)->param;
|
|
void *result;
|
|
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 */
|
|
result= (void*) (*func)(func_param);
|
|
my_thread_end();
|
|
pthread_exit(result);
|
|
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;
|
|
DWORD StackSize= 0;
|
|
int priority= 0;
|
|
DBUG_ENTER("pthread_create");
|
|
|
|
if (!(map=malloc(sizeof(*map))))
|
|
DBUG_RETURN(-1);
|
|
map->func=func;
|
|
map->param=param;
|
|
if (attr != NULL)
|
|
{
|
|
StackSize= attr->dwStackSize;
|
|
priority= attr->priority;
|
|
}
|
|
if (StackSize == 0)
|
|
StackSize= PTHREAD_STACK_MIN;
|
|
pthread_mutex_lock(&THR_LOCK_thread);
|
|
#ifdef __BORLANDC__
|
|
hThread=(HANDLE)_beginthread((void(_USERENTRY *)(void *)) pthread_start,
|
|
StackSize, (void*) map);
|
|
#else
|
|
hThread=(HANDLE)_beginthread((void( __cdecl *)(void *)) pthread_start,
|
|
StackSize, (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, 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
|