⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 my_winthread.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
字号:
/* 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -