NdbThread.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <windows.h>
  14. #include <process.h>
  15. #include "NdbThread.h"
  16. #define MAX_THREAD_NAME 16
  17. typedef unsigned (WINAPI* NDB_WIN32_THREAD_FUNC)(void*);
  18. struct NdbThread 
  19.     HANDLE hThread;
  20.     unsigned nThreadId;
  21.     char thread_name[MAX_THREAD_NAME];
  22. };
  23. struct NdbThread* NdbThread_Create(NDB_THREAD_FUNC *p_thread_func,
  24.                                    NDB_THREAD_ARG *p_thread_arg,
  25.                                    const NDB_THREAD_STACKSIZE thread_stack_size,
  26.                                    const char* p_thread_name,
  27.                                    NDB_THREAD_PRIO thread_prio)
  28. {
  29.     struct NdbThread* tmpThread;
  30.     unsigned initflag;
  31.     int nPriority = 0;
  32.     if(!p_thread_func)
  33.         return 0;
  34.     
  35.     tmpThread = (struct NdbThread*)malloc(sizeof(struct NdbThread));
  36.     if(!tmpThread)
  37.         return 0;
  38.     
  39.     strncpy((char*)&tmpThread->thread_name, p_thread_name, MAX_THREAD_NAME);
  40.     
  41.     switch(thread_prio)
  42.     {
  43.     case NDB_THREAD_PRIO_HIGHEST: nPriority=THREAD_PRIORITY_HIGHEST; break;
  44.     case NDB_THREAD_PRIO_HIGH: nPriority=THREAD_PRIORITY_ABOVE_NORMAL; break;
  45.     case NDB_THREAD_PRIO_MEAN: nPriority=THREAD_PRIORITY_NORMAL; break;
  46.     case NDB_THREAD_PRIO_LOW: nPriority=THREAD_PRIORITY_BELOW_NORMAL; break;
  47.     case NDB_THREAD_PRIO_LOWEST: nPriority=THREAD_PRIORITY_LOWEST; break;
  48.     }
  49.     initflag = (nPriority ? CREATE_SUSPENDED : 0);
  50.     
  51.     tmpThread->hThread = (HANDLE)_beginthreadex(0, thread_stack_size,
  52.         (NDB_WIN32_THREAD_FUNC)p_thread_func, p_thread_arg, 
  53.         initflag, &tmpThread->nThreadId);
  54.     
  55.     if(nPriority && tmpThread->hThread)
  56.     {
  57.         SetThreadPriority(tmpThread->hThread, nPriority);
  58.         ResumeThread (tmpThread->hThread);
  59.     }
  60.     
  61.     assert(tmpThread->hThread);
  62.     return tmpThread;
  63. }
  64. void NdbThread_Destroy(struct NdbThread** p_thread)
  65. {
  66.     CloseHandle((*p_thread)->hThread);
  67.     (*p_thread)->hThread = 0;
  68.     free(*p_thread); 
  69.     *p_thread = 0;
  70. }
  71. int NdbThread_WaitFor(struct NdbThread* p_wait_thread, void** status)
  72. {
  73.     void *local_status = 0;
  74.     if (status == 0)
  75.         status = &local_status;
  76.     
  77.     if(WaitForSingleObject(p_wait_thread->hThread, INFINITE) == WAIT_OBJECT_0
  78.         && GetExitCodeThread(p_wait_thread->hThread, (LPDWORD)status))
  79.     {
  80.         CloseHandle(p_wait_thread->hThread);
  81.         p_wait_thread->hThread = 0;
  82.         return 0;
  83.     }
  84.     return -1; 
  85. }
  86. void NdbThread_Exit(int status)
  87. {
  88.     _endthreadex((DWORD) status);
  89. }
  90. int NdbThread_SetConcurrencyLevel(int level)
  91. {
  92.     return 0;
  93. }