home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / mysys / my_winthread.c < prev    next >
C/C++ Source or Header  |  2000-10-17  |  4KB  |  120 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17.  
  18. /*****************************************************************************
  19. ** Simulation of posix threads calls for WIN95 and NT
  20. *****************************************************************************/
  21.  
  22. /* SAFE_MUTEX will not work until the thread structure is up to date */
  23. #undef SAFE_MUTEX
  24.  
  25. #include "mysys_priv.h"
  26. #if defined(THREAD) && defined(__WIN__)
  27. #include <m_string.h>
  28. #undef getpid
  29. #include <process.h>
  30.  
  31. static pthread_mutex_t THR_LOCK_thread;
  32.  
  33. struct pthread_map
  34. {
  35.   HANDLE pthreadself;
  36.   pthread_handler func;
  37.   void *param;
  38. };
  39.  
  40. void win_pthread_init(void)
  41. {
  42.   pthread_mutex_init(&THR_LOCK_thread,NULL);
  43. }
  44.  
  45. /*
  46. ** We have tried to use '_beginthreadex' instead of '_beginthread' here
  47. ** but in this case the program leaks about 512 characters for each
  48. ** created thread !
  49. ** As we want to save the created thread handler for other threads to
  50. ** use and to be returned by pthread_self() (instead of the Win32 pseudo
  51. ** handler), we have to go trough pthread_start() to catch the returned handler
  52. ** in the new thread.
  53. */
  54.  
  55. static pthread_handler_decl(pthread_start,param)
  56. {
  57.   pthread_handler func=((struct pthread_map *) param)->func;
  58.   void *func_param=((struct pthread_map *) param)->param;
  59.   my_thread_init();            /* Will always succeed in windows */
  60.   pthread_mutex_lock(&THR_LOCK_thread);      /* Wait for beginthread to return */
  61.   win_pthread_self=((struct pthread_map *) param)->pthreadself;
  62.   pthread_mutex_unlock(&THR_LOCK_thread);
  63.   free((char*) param);              /* Free param from create */
  64.   pthread_exit((void*) (*func)(func_param));
  65.   return 0;                  /* Safety */
  66. }
  67.  
  68.  
  69. int pthread_create(pthread_t *thread_id, pthread_attr_t *attr,
  70.            pthread_handler func, void *param)
  71. {
  72.   HANDLE hThread;
  73.   struct pthread_map *map;
  74.   DBUG_ENTER("pthread_create");
  75.  
  76.   if (!(map=malloc(sizeof(*map))))
  77.     DBUG_RETURN(-1);
  78.   map->func=func;
  79.   map->param=param;
  80.   pthread_mutex_lock(&THR_LOCK_thread);
  81. #ifdef __BORLANDC__
  82.   hThread=(HANDLE)_beginthread((void(_USERENTRY *)(void *)) pthread_start,
  83.                    attr->dwStackSize ? attr->dwStackSize :
  84.                    65535, (void*) map);
  85. #else
  86.   hThread=(HANDLE)_beginthread((void( __cdecl *)(void *)) pthread_start,
  87.                    attr->dwStackSize ? attr->dwStackSize :
  88.                    65535, (void*) map);
  89. #endif
  90.   DBUG_PRINT("info", ("hThread=%lu",(long) hThread));
  91.   *thread_id=map->pthreadself=hThread;
  92.   pthread_mutex_unlock(&THR_LOCK_thread);
  93.  
  94.   if (hThread == (HANDLE) -1)
  95.   {
  96.     int error=errno;
  97.     DBUG_PRINT("error",
  98.            ("Can't create thread to handle request (error %d)",error));
  99.     DBUG_RETURN(error ? error : -1);
  100.   }
  101.   VOID(SetThreadPriority(hThread, attr->priority)) ;
  102.   DBUG_RETURN(0);
  103. }
  104.  
  105.  
  106. void pthread_exit(void *a)
  107. {
  108.   _endthread();
  109. }
  110.  
  111. /* This is neaded to get the macro pthread_setspecific to work */
  112.  
  113. int win_pthread_setspecific(void *a,void *b,uint length)
  114. {
  115.   memcpy(a,b,length);
  116.   return 0;
  117. }
  118.  
  119. #endif
  120.