CallTempStruct* getCurrentTempCallStruct(JNIEnv* env) { CallTempStructNode* pNode = (CallTempStructNode*)GET_THREAD_LOCAL_DATA(); if (!pNode || !pNode->fUsed) return NULL; return &pNode->fCallTempStruct; }
void releaseTempCallStruct(JNIEnv* env, CallTempStruct* s) { CallTempStructNode* pNode = (CallTempStructNode*)GET_THREAD_LOCAL_DATA(); if (!pNode || &pNode->fCallTempStruct != s) { throwException(env, "Invalid thread-local status : critical bug !"); return; } pNode->fUsed = JNI_FALSE; if (pNode->fPrevious) SET_THREAD_LOCAL_DATA(pNode->fPrevious); }
void releaseTempCallStruct(JNIEnv* env, CallTempStruct* s) { CallTempStructNode* pNode = (CallTempStructNode*)GET_THREAD_LOCAL_DATA(); if (!pNode || &pNode->fCallTempStruct != s) { throwException(env, "Invalid thread-local status : critical bug !"); return; } pNode->fUsed = JNI_FALSE; if (s->localRefsToCleanup.buffer) { free(s->localRefsToCleanup.buffer); s->localRefsToCleanup.buffer = NULL; s->localRefsToCleanup.bufferLength = 0; s->localRefsToCleanup.length = 0; } if (pNode->fPrevious) SET_THREAD_LOCAL_DATA(pNode->fPrevious); }
CallTempStruct* getTempCallStruct(JNIEnv* env) { CallTempStructNode* pNode = (CallTempStructNode*)GET_THREAD_LOCAL_DATA(); if (!pNode) { pNode = NewNode(NULL); SET_THREAD_LOCAL_DATA(pNode); } if (pNode->fUsed) { if (!pNode->fNext) pNode->fNext = NewNode(pNode); pNode = pNode->fNext; SET_THREAD_LOCAL_DATA(pNode); } pNode->fUsed = JNI_TRUE; return &pNode->fCallTempStruct; }
void freeCurrentThreadLocalData() { CallTempStructNode* pNode = (CallTempStructNode*)GET_THREAD_LOCAL_DATA(); FreeNodes(pNode); SET_THREAD_LOCAL_DATA(NULL); }