You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/09/02 14:11:26 UTC
svn commit: r810473 - in /commons/sandbox/runtime/trunk/src/main/native:
include/acr_vm.h os/unix/main.c os/win32/main.c
Author: mturk
Date: Wed Sep 2 12:11:25 2009
New Revision: 810473
URL: http://svn.apache.org/viewvc?rev=810473&view=rev
Log:
Add full support for thread local data
Modified:
commons/sandbox/runtime/trunk/src/main/native/include/acr_vm.h
commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_vm.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_vm.h?rev=810473&r1=810472&r2=810473&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_vm.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_vm.h Wed Sep 2 12:11:25 2009
@@ -31,7 +31,19 @@
*
*/
-/*
+typedef struct acr_thread_local_t {
+ JNIEnv *env;
+ int jvm_attached;
+} acr_thread_local_t;
+
+/**
+ * Get current thread local storage data
+ * Returns 0 if tlsd was already allocated, 1 if new block
+ * was allocated and -1 in case of error.
+ */
+ACR_DECLARE(int) ACR_GetTLSD(acr_thread_local_t **tlsd);
+
+/**
* Get current thread JNI Environment
* @remark The function will attach to the
* current JVM thread. This function must be called to obtain the JNIEnv
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c?rev=810473&r1=810472&r2=810473&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c Wed Sep 2 12:11:25 2009
@@ -45,11 +45,6 @@
mode_t acr_default_umask;
mode_t acr_default_perms;
-typedef struct acr_thread_local_t {
- JNIEnv *env;
- int attached;
-} acr_thread_local_t;
-
static void acr_thread_key_destructor(void *data)
{
acr_thread_local_t *t = (acr_thread_local_t *)data;
@@ -57,7 +52,7 @@
/* Destructor will be called only if data is
* not NULL
*/
- if (t->attached) {
+ if (t->jvm_attached && acr_pvm) {
(*acr_pvm)->DetachCurrentThread(acr_pvm);
}
free(t);
@@ -106,19 +101,35 @@
return JNI_VERSION_1_4;
}
-ACR_DECLARE(JNIEnv *)ACR_GetJNIEnv()
+ACR_DECLARE(int) ACR_GetTLSD(acr_thread_local_t **tlsd)
+{
+ *tlsd = (acr_thread_local_t *)pthread_getspecific(acr_thread_key);
+ if (*tlsd == NULL) {
+ *tlsd = (acr_thread_local_t *)calloc(1, sizeof(acr_thread_local_t));
+ if (*tlsd == NULL)
+ return -1;
+ else {
+ pthread_setspecific(acr_thread_key, *tlsd);
+ return 1;
+ }
+ }
+ else
+ return 0;
+}
+
+ACR_DECLARE(JNIEnv *) ACR_GetJNIEnv()
{
+ int rc;
acr_thread_local_t *tlsd;
void *epp = NULL;
if (acr_pvm == NULL) {
return NULL;
}
- tlsd = (acr_thread_local_t *)pthread_getspecific(acr_thread_key);
- if (tlsd == NULL) {
- tlsd = (acr_thread_local_t *)malloc(sizeof(acr_thread_local_t));
- if (tlsd == NULL)
- return NULL;
+ rc = ACR_GetTLSD(&tlsd);
+ if (rc < 0)
+ return NULL;
+ if (rc == 1) {
if ((*acr_pvm)->GetEnv(acr_pvm, &epp,
JNI_VERSION_1_4) == JNI_EDETACHED) {
char tn[32];
@@ -129,12 +140,9 @@
aa.name = tn;
aa.group = NULL;
(*acr_pvm)->AttachCurrentThreadAsDaemon(acr_pvm, &epp, &aa);
- tlsd->attached = 1;
+ tlsd->jvm_attached = 1;
}
- else
- tlsd->attached = 0;
tlsd->env = epp;
- pthread_setspecific(acr_thread_key, tlsd);
}
return tlsd->env;
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c?rev=810473&r1=810472&r2=810473&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c Wed Sep 2 12:11:25 2009
@@ -47,10 +47,18 @@
PSID acr_everyone_sid = NULL;
PSID acr_adminsgr_sid = NULL;
-typedef struct acr_thread_local_t {
- JNIEnv *env;
- int attached;
-} acr_thread_local_t;
+static void acr_thread_key_destructor(void *data)
+{
+ acr_thread_local_t *t = (acr_thread_local_t *)data;
+
+ /* Destructor will be called only if data is
+ * not NULL
+ */
+ if (t->jvm_attached && acr_pvm) {
+ (*acr_pvm)->DetachCurrentThread(acr_pvm);
+ }
+ ACR_HeapFree(t);;
+}
BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
{
@@ -79,10 +87,7 @@
if (dll_tls_index != TLS_OUT_OF_INDEXES) {
tlsd = (acr_thread_local_t *)TlsGetValue(dll_tls_index);
if (tlsd) {
- if (acr_pvm && tlsd->attached) {
- (*acr_pvm)->DetachCurrentThread(acr_pvm);
- }
- ACR_HeapFree(tlsd);
+ acr_thread_key_destructor(tlsd);
}
}
break;
@@ -101,10 +106,7 @@
if (dll_tls_index != TLS_OUT_OF_INDEXES) {
tlsd = (acr_thread_local_t *)TlsGetValue(dll_tls_index);
if (tlsd) {
- if (acr_pvm && tlsd->attached) {
- (*acr_pvm)->DetachCurrentThread(acr_pvm);
- }
- ACR_HeapFree(tlsd);
+ acr_thread_key_destructor(tlsd);
}
TlsFree(dll_tls_index);
}
@@ -326,19 +328,35 @@
return JNI_VERSION_1_4;
}
+ACR_DECLARE(int) ACR_GetTLSD(acr_thread_local_t **tlsd)
+{
+ *tlsd = (acr_thread_local_t *)TlsGetValue(dll_tls_index);
+ if (*tlsd == NULL) {
+ *tlsd = (acr_thread_local_t *)ACR_HeapCalloc(sizeof(acr_thread_local_t));
+ if (*tlsd == NULL)
+ return -1;
+ else {
+ TlsSetValue(dll_tls_index, *tlsd);
+ return 1;
+ }
+ }
+ else
+ return 0;
+}
+
ACR_DECLARE(JNIEnv *)ACR_GetJNIEnv()
{
+ int rc;
acr_thread_local_t *tlsd;
void *epp = NULL;
if (acr_pvm == NULL) {
return NULL;
}
- tlsd = (acr_thread_local_t *)TlsGetValue(dll_tls_index);
- if (tlsd == NULL) {
- tlsd = (acr_thread_local_t *)ACR_HeapCalloc(sizeof(acr_thread_local_t));
- if (tlsd == NULL)
- return NULL;
+ rc = ACR_GetTLSD(&tlsd);
+ if (rc < 0)
+ return NULL;
+ if (rc == 1) {
if ((*acr_pvm)->GetEnv(acr_pvm, &epp,
JNI_VERSION_1_4) == JNI_EDETACHED) {
char tn[32];
@@ -349,10 +367,9 @@
aa.name = tn;
aa.group = NULL;
(*acr_pvm)->AttachCurrentThreadAsDaemon(acr_pvm, &epp, &aa);
- tlsd->attached = 1;
+ tlsd->jvm_attached = 1;
}
tlsd->env = epp;
- TlsSetValue(dll_tls_index, tlsd);
}
return tlsd->env;
}