ndbthread.c
来自「MySQL数据库开发源码 值得一看哦」· C语言 代码 · 共 184 行
C
184 行
/* Copyright (C) 2003 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; either version 2 of the License, or (at your option) any later version. 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 */#include "NdbThread.h"#include <pthread.h>#include <malloc.h>#include <string.h>#include <NdbOut.hpp>#define MAX_THREAD_NAME 16struct NdbThread { PROCESS pid; char thread_name[MAX_THREAD_NAME];};#define NDBTHREAD_SIGBASE 4010 #define NDBTHREAD_START (NDBTHREAD_SIGBASE + 1) /* !-SIGNO(struct NdbThreadStart)-! */ struct NdbThreadStart{ SIGSELECT sigNo; NDB_THREAD_FUNC* func; NDB_THREAD_ARG arg;};struct NdbThreadStopped{ SIGSELECT sigNo;};union SIGNAL { SIGSELECT sigNo; struct NdbThreadStart threadStart; struct NdbThreadStopped threadStopped;};OS_PROCESS(thread_starter){ static const SIGSELECT sel_start[] = {1, NDBTHREAD_START}; struct NdbThreadStart* sigstart; union SIGNAL* sig; /* Receive function adress and params */ sig = receive((SIGSELECT*)sel_start); if (sig != NIL){ if (sig->sigNo == NDBTHREAD_START){ sigstart = ((struct NdbThreadStart*)sig); /* Execute function with arg */ (*sigstart->func)(sigstart->arg); }else{ assert(1==0); } free_buf(&sig); }}struct NdbThread* NdbThread_Create(NDB_THREAD_FUNC* p_thread_func, NDB_THREAD_ARG *p_thread_arg, const NDB_THREAD_STACKSIZE thread_stack_size, const char* p_thread_name, NDB_THREAD_PRIO thread_prio){ struct NdbThread* tmpThread; union SIGNAL* sig; int ose_prio; if (p_thread_func == NULL) return 0; tmpThread = (struct NdbThread*)malloc(sizeof(struct NdbThread)); if (tmpThread == NULL) return NULL; strncpy((char*)&tmpThread->thread_name, p_thread_name, MAX_THREAD_NAME); switch(thread_prio){ case NDB_THREAD_PRIO_HIGHEST: ose_prio = 1; break; case NDB_THREAD_PRIO_HIGH: ose_prio = 10; break; case NDB_THREAD_PRIO_MEAN: ose_prio = 16; break; case NDB_THREAD_PRIO_LOW: ose_prio = 23; break; case NDB_THREAD_PRIO_LOWEST: ose_prio = 31; break; default: return NULL; break; } /* Create process */ tmpThread->pid = create_process(OS_PRI_PROC, /* Process type */ (char*)p_thread_name, /* Name */ thread_starter, /* Entry point */ thread_stack_size, /* Stack size */ ose_prio, /* Priority */ 0, /* Time slice */ get_bid(current_process()), /* Block */ NULL, /* Redir table */ 0, 0); /* Send params to process */ sig = alloc(sizeof(struct NdbThreadStart), NDBTHREAD_START); ((struct NdbThreadStart*)sig)->func = p_thread_func; ((struct NdbThreadStart*)sig)->arg = p_thread_arg; send(&sig, tmpThread->pid); /* Enable NDB_HOME environment variable for the thread */ { /* Hardcoded NDB_HOME...*/ char* ndb_home_env = get_env(current_process(), "NDB_HOME"); if (ndb_home_env != NULL) { /* Set NDB_HOME */ int rc = set_env(tmpThread->pid, "NDB_HOME", ndb_home_env); if (rc != 0) { /* Not really a problem */ } } /* Enable NDB_HOME */ } /* Start process */ start(tmpThread->pid); return tmpThread;}void NdbThread_Destroy(struct NdbThread** p_thread){ free(* p_thread); * p_thread = 0;}int NdbThread_WaitFor(struct NdbThread* p_wait_thread, void** status){ while(hunt(p_wait_thread->thread_name, 0, NULL, NULL) != 0) delay(1000); * status = 0; return 0;}void NdbThread_Exit(int a){ kill_proc(current_process());}int NdbThread_SetConcurrencyLevel(int level){ return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?