STATUS virtualStackNumTaskIdSet ( int vsNum ) { /* * If we this task does not have the task variable then * create it as part of this task. */ if (taskVarGet(0, (int *) &myStackNum) == ERROR) { if (errnoGet () == S_taskLib_TASK_VAR_NOT_FOUND) errnoSet (0); /* Resets the error caused by taskVarGet */ taskVarAdd (0, (int *) &myStackNum); } if (vsNum > VSID_MAX) return (ERROR); if (vsTbl[vsNum] == NULL) return (ERROR); myStackNum = vsNum; return (OK); }
void ThreadImpl::callableEntry(void* pThread, int, int, int, int, int, int, int, int, int) { taskVarAdd(0, reinterpret_cast<int*>(&_pCurrent)); _pCurrent = reinterpret_cast<ThreadImpl*>(pThread); AutoPtr<ThreadData> pData = _pCurrent->_pData; try { pData->pCallbackTarget->callback(pData->pCallbackTarget->pData); } catch (Exception& exc) { ErrorHandler::handle(exc); } catch (std::exception& exc) { ErrorHandler::handle(exc); } catch (...) { ErrorHandler::handle(); } pData->pCallbackTarget->callback = 0; pData->pCallbackTarget->pData = 0; pData->done.set(); }
CVMBool CVMthreadAttach(CVMThreadID *self, CVMBool orphan) { if (orphan) { self->taskID = taskIdSelf(); } else { assert(self->taskID == taskIdSelf()); } fpuInit(); if (!vxworksSyncInit(self)) { CVMdebugPrintf(("WARNING: CVMthreadAttach failed.\n")); return CVM_FALSE; } /* NOTE: taskVarAdd() creates a unique copy of the mySelf pointer for each task so that we can have a unique thread ID for each task: */ taskVarAdd(0, (int *)&mySelf); mySelf = self; { TASK_DESC desc; taskInfoGet(0, &desc); self->stackTop = desc.td_pStackLimit; } return CVM_TRUE; }
volatile int *__erl_errno_place(void) { /* This check is somewhat insufficient, double task var entries will occur if __erl_errno is actually -1, which on the other hand is an invalid error code. */ if (taskVarGet(taskIdSelf(), &__erl_errno) == ERROR) { taskVarAdd(taskIdSelf(), &__erl_errno); } return &__erl_errno; }
STATUS virtualStackIdCheck ( ) { if (taskVarGet(0, (int *)&myStackNum) == ERROR) { taskVarAdd(0, (int *)&myStackNum); myStackNum = VS_MGMT_STACK; } return (OK); }
void x_ipc_globalMInit(void) { #if defined(VXWORKS) if (x_ipc_gM == NULL) { if (taskVarAdd(0, (int *)&x_ipc_gM) != OK) { printErr("taskVarAdd failed\n"); } } #endif if (mGlobalp() && GET_C_GLOBAL(valid)) { /* Already initialized, nothing to do. */ return; } else if (x_ipc_isValidServerConnection()) { /* Already running, shut down and reinitialize. */ LOCK_CM_MUTEX; SHUTDOWN_SOCKET(GET_C_GLOBAL(serverRead)); if (GET_C_GLOBAL(serverRead) != GET_C_GLOBAL(serverWrite)) SHUTDOWN_SOCKET(GET_C_GLOBAL(serverWrite)); UNLOCK_CM_MUTEX; x_ipc_globalMInvalidate(); x_ipc_globalMFree(); } else if (mGlobalp()){ /* Was initialized, but the current values are not valid. */ /* Free some memory and reinitialize. */ x_ipc_globalMFree(); } /* Never created or has been freed, set the global pointer. */ #if defined(VXWORKS) x_ipc_gM = (GM_TYPE *)x_ipcMalloc(sizeof(GM_TYPE)); bzero((void *)x_ipc_gM,sizeof(GM_TYPE)); #else x_ipc_gM_ptr = &x_ipc_gM; #endif #ifdef THREADED initMutex(&GET_M_GLOBAL(mutex)); #endif GET_M_GLOBAL(currentContext) = (X_IPC_CONTEXT_PTR)x_ipcMalloc(sizeof(X_IPC_CONTEXT_TYPE)); #ifdef THREADED initMutex(&GET_C_GLOBAL(mutex)); LOCK_CM_MUTEX; initMutex(&GET_M_GLOBAL(selectMutex)); initPing(&GET_M_GLOBAL(ping)); initMutex(&GET_C_GLOBAL(ioMutex)); initMutex(&listMutex); #endif #if defined(VXWORKS) || defined(NMP_IPC) GET_M_GLOBAL(enableDistributedResponses) = TRUE; #else GET_M_GLOBAL(enableDistributedResponses) = FALSE; #endif GET_C_GLOBAL(willListen) = -1; GET_C_GLOBAL(valid) = FALSE; GET_M_GLOBAL(byteOrder) = BYTE_ORDER; GET_M_GLOBAL(alignment) = (ALIGNMENT_TYPE)ALIGN; GET_C_GLOBAL(serverRead) = NO_SERVER_GLOBAL; GET_C_GLOBAL(serverWrite) = NO_SERVER_GLOBAL; GET_C_GLOBAL(directDefault) = FALSE; GET_M_GLOBAL(pipeBroken) = FALSE; GET_M_GLOBAL(bufferToAlloc) = NULL; /* not done */ GET_M_GLOBAL(byteFormat) = NULL; GET_M_GLOBAL(charFormat) = NULL; GET_M_GLOBAL(doubleFormat) = NULL; GET_M_GLOBAL(floatFormat) = NULL; GET_M_GLOBAL(intFormat) = NULL; GET_M_GLOBAL(longFormat) = NULL; GET_M_GLOBAL(shortFormat) = NULL; GET_M_GLOBAL(classFormatTable) = NULL; GET_M_GLOBAL(formatNamesTable) = NULL; GET_C_GLOBAL(handlerTable) = NULL; GET_C_GLOBAL(messageTable) = NULL; GET_C_GLOBAL(resourceTable) = NULL; GET_C_GLOBAL(hndIdTable) = NULL; GET_C_GLOBAL(msgIdTable) = NULL; GET_M_GLOBAL(listCellFreeListGlobal) = NULL; GET_M_GLOBAL(dataMsgBufferList) = NULL; GET_M_GLOBAL(listFreeListGlobal) = NULL; GET_C_GLOBAL(moduleConnectionTable) = NULL; GET_C_GLOBAL(pendingReplies) = NULL; initMsgQueue(&GET_C_GLOBAL(msgQueue)); GET_C_GLOBAL(queryNotificationList) = NULL; GET_C_GLOBAL(connectNotifyList) = NULL; GET_C_GLOBAL(disconnectNotifyList) = NULL; GET_C_GLOBAL(changeNotifyList) = NULL; GET_C_GLOBAL(x_ipcRefFreeList) = NULL; /* GET_M_GLOBAL(x_ipcDefaultTimeGlobal) = {NoTime, {NoInterval, 0}}; */ /* 16-Jan-93 */ /* GET_M_GLOBAL(versionGlobal);*/ #if defined(DBMALLOC) GET_M_GLOBAL(x_ipcMallocMemHnd) = debug_malloc; #elif defined(__TURBOC__) GET_M_GLOBAL(x_ipcMallocMemHnd) = farmalloc; #else GET_M_GLOBAL(x_ipcMallocMemHnd) = malloc; #endif GET_M_GLOBAL(modNameGlobal) = NULL; GET_C_GLOBAL(servHostGlobal) = NULL; FD_ZERO(&(GET_C_GLOBAL(x_ipcConnectionListGlobal))); FD_ZERO(&(GET_C_GLOBAL(x_ipcListenMaskGlobal))); #ifdef LISP GET_M_GLOBAL(lispFlagGlobal) = '\0'; GET_M_GLOBAL(lispRefSaveGlobal) = NULL; #ifdef CLISP GET_M_GLOBAL(lispBufferSizeGlobal) = lispbuffersize; GET_M_GLOBAL(lispDecodeMsgGlobal) = lispdecode; GET_M_GLOBAL(lispEncodeMsgGlobal) = lispencode; GET_M_GLOBAL(lispExitGlobal) = lispexit; #else /* !CLISP */ GET_M_GLOBAL(lispBufferSizeGlobal) = NULL; GET_M_GLOBAL(lispDecodeMsgGlobal) = NULL; GET_M_GLOBAL(lispEncodeMsgGlobal) = NULL; GET_M_GLOBAL(lispExitGlobal) = NULL; #endif /* !CLISP */ #ifdef NMP_IPC GET_M_GLOBAL(lispQueryResponseGlobal) = NULL; #endif #endif /* LISP */ GET_M_GLOBAL(DMFree) = 0; GET_M_GLOBAL(DMTotal) =0; GET_M_GLOBAL(DMmin) = 0; GET_M_GLOBAL(DMmax) = 0;; GET_M_GLOBAL(directFlagGlobal) = 0; GET_M_GLOBAL(expectedWaitGlobal) = FALSE; GET_M_GLOBAL(freeMemRetryAmount) = 0; /* not done - only used in behaviors.c does not change */ GET_M_GLOBAL(inconsistentConstraintsGlobal)[0] = (PLAN_FIRST+DELAY_PLANNING); GET_M_GLOBAL(inconsistentConstraintsGlobal)[1] = 0; GET_M_GLOBAL(mallocMemRetryAmount) = 1; GET_C_GLOBAL(parentRefGlobal) = -1; GET_C_GLOBAL(sendMessageRefGlobal) = 1; GET_C_GLOBAL(listenPortNum) = 0; GET_C_GLOBAL(listenPort) = NO_FD; GET_C_GLOBAL(listenSocket) = NO_FD; GET_M_GLOBAL(totalMemRequest) = 0; GET_M_GLOBAL(totalMemBytes) = 0; GET_M_GLOBAL(indentGlobal) = 0; GET_M_GLOBAL(dPrintBYTE_FN) = NULL; GET_M_GLOBAL(dPrintUBYTE_FN) = NULL; GET_M_GLOBAL(dPrintCHAR_FN) = NULL; GET_M_GLOBAL(dPrintDOUBLE_FN) = NULL; GET_M_GLOBAL(dPrintFLOAT_FN) = NULL; GET_M_GLOBAL(dPrintFORMAT_FN) = NULL; GET_M_GLOBAL(dPrintINT_FN) = NULL; GET_M_GLOBAL(dPrintBOOLEAN_FN) = NULL; GET_M_GLOBAL(dPrintLONG_FN) = NULL; #ifndef NMP_IPC GET_M_GLOBAL(dPrintMAP_FN) = NULL; #endif GET_M_GLOBAL(dPrintSHORT_FN) = NULL; GET_M_GLOBAL(dPrintSTR_FN) = NULL; GET_M_GLOBAL(dPrintX_IPC_FN) = NULL; GET_M_GLOBAL(dPrintTWOBYTE_FN) = NULL; GET_M_GLOBAL(dPrintUINT_FN) = NULL; GET_M_GLOBAL(dPrintUSHORT_FN) = NULL; GET_M_GLOBAL(dPrintULONG_FN) = NULL; GET_M_GLOBAL(Message_Ignore_Set) = NULL; GET_M_GLOBAL(x_ipcExitHnd) = NULL; GET_M_GLOBAL(x_ipcFreeMemoryHnd) = NULL; GET_M_GLOBAL(logList)[0] = NULL; GET_M_GLOBAL(logList)[1] = NULL; GET_M_GLOBAL(logList)[2] = NULL; GET_M_GLOBAL(Found_Key) = NULL;/***/ GET_C_GLOBAL(tappedMsgs) = NULL; GET_C_GLOBAL(broadcastMsgs) = NULL; GET_C_GLOBAL(maxConnection) = 0; GET_M_GLOBAL(requiredResources) = x_ipc_strListCreate(); GET_M_GLOBAL(moduleList) = NULL; #ifdef NMP_IPC GET_M_GLOBAL(timerList) = x_ipc_listCreate(); #endif #ifdef LISPWORKS_FFI_HACK GET_C_GLOBAL(execHndState).state = ExecHnd_Idle; #endif UNLOCK_CM_MUTEX; }