vtopen.c
来自「su 的源代码库」· C语言 代码 · 共 111 行
C
111 行
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved. */#include "vthdr.h"static char* Version = "\n@(#)vthread (AT&T Labs - kpv) 2000-12-01\0\n";/* Open a thread handle**** Written by Kiem-Phong Vo*/#if __STD_CVthread_t* vtopen(Vthread_t* vt, int flags)#elseVthread_t* vtopen(vt, flags)Vthread_t* vt;int flags;#endif{#if !vt_threaded return NIL(Vthread_t*);#else Vthread_t* v; int s, slot, myvt; VTONCE(); v = (Vthread_t*)Version; /* shut compiler warning */ vtmtxlock(_Vtmutex); myvt = 0; if(vt) { /* if there is a running thread, wait for its termination */ for(slot = 0; slot < _Vtnlist; ++slot) if(_Vtlist[slot] == vt) break; if(slot < _Vtnlist && (vt->state&VT_RUNNING) ) { vtmtxunlock(_Vtmutex); if(vtwait(vt) < 0) return NIL(Vthread_t*); vtmtxlock(_Vtmutex); } if(slot == _Vtnlist) goto find_slot; } else { find_slot: for(slot = 0; slot < _Vtnlist; ++slot) if(_Vtlist[slot] == NIL(Vthread_t*)) break; } /* create a slot for this new thread if necessary */ if(slot >= _Vtnlist) { Vthread_t** list;#define INCR 8 if(!(list = (Vthread_t**)malloc((slot+INCR)*sizeof(Vthread_t*))) ) { vtmtxunlock(_Vtmutex); return NIL(Vthread_t*); } if(_Vtnlist > 0) { memcpy(list,_Vtlist,_Vtnlist*sizeof(Vthread_t*)); free(_Vtlist); } _Vtlist = list; _Vtnlist += INCR; for(s = slot; s < _Vtnlist; ++s) list[s] = NIL(Vthread_t*); } if(!(v = vt) ) { if(!(v = (Vthread_t*)malloc(sizeof(Vthread_t))) ) { vtmtxunlock(_Vtmutex); return NIL(Vthread_t*); } flags |= VT_INIT|VT_FREE; myvt = 1; } if(flags&VT_INIT) { v->state = (flags&VT_FREE); v->stack = 0; v->error = 0; v->exit = NIL(Void_t*);#if !_WIN32 if(pthread_attr_init(&v->attrs) != 0) { if(myvt) free(v); vtmtxunlock(_Vtmutex); return NIL(Vthread_t*); }#endif } _Vtlist[slot] = v; vtmtxunlock(_Vtmutex); return v;#endif /*vt_threaded*/}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?