more ZTS fixes.

This commit is contained in:
foobar 2001-07-31 23:47:35 +00:00
parent e7ea61ad98
commit 474da88b4c
7 changed files with 168 additions and 239 deletions

View file

@ -79,31 +79,21 @@ static char *javalib = 0;
static int iniUpdated = 0;
static void *dl_handle = 0;
typedef struct {
ZEND_BEGIN_MODULE_GLOBALS(java)
JavaVM *jvm;
JNIEnv *jenv;
jobject php_reflect;
jclass reflect_class;
} php_java_globals;
ZEND_END_MODULE_GLOBALS(java)
#ifdef ZTS
#define JG(v) (java_globals->v)
#define JG_FETCH() php_java_globals *java_globals = ts_resource(java_globals_id)
#define JG_D php_java_globals *java_globals
#define JG_DC , JG_D
#define JG_C java_globals
#define JG_CC , JG_C
int java_globals_id;
# define JG(v) TSRMG(java_globals_id, zend_java_globals *, v)
#else
#define JG(v) (java_globals.v)
#define JG_FETCH()
#define JG_D
#define JG_DC
#define JG_C
#define JG_CC
php_java_globals java_globals;
# define JG(v) (java_globals.v)
#endif
ZEND_DECLARE_MODULE_GLOBALS(java)
static zend_class_entry java_class_entry;
static PHP_INI_MH(OnIniUpdate)
@ -114,20 +104,15 @@ static PHP_INI_MH(OnIniUpdate)
}
PHP_INI_BEGIN()
PHP_INI_ENTRY1("java.class.path",
NULL, PHP_INI_ALL, OnIniUpdate, &classpath)
PHP_INI_ENTRY1("java.class.path", NULL, PHP_INI_ALL, OnIniUpdate, &classpath)
#ifndef JNI_11
PHP_INI_ENTRY1("java.home",
NULL, PHP_INI_ALL, OnIniUpdate, &javahome)
PHP_INI_ENTRY1("java.library.path",
NULL, PHP_INI_ALL, OnIniUpdate, &libpath)
PHP_INI_ENTRY1("java.home", NULL, PHP_INI_ALL, OnIniUpdate, &javahome)
PHP_INI_ENTRY1("java.library.path", NULL, PHP_INI_ALL, OnIniUpdate, &libpath)
#endif
#ifdef JAVALIB
PHP_INI_ENTRY1("java.library",
JAVALIB, PHP_INI_ALL, OnIniUpdate, &javalib)
PHP_INI_ENTRY1("java.library", JAVALIB, PHP_INI_ALL, OnIniUpdate, &javalib)
#else
PHP_INI_ENTRY1("java.library",
NULL, PHP_INI_ALL, OnIniUpdate, &javalib)
PHP_INI_ENTRY1("java.library", NULL, PHP_INI_ALL, OnIniUpdate, &javalib)
#endif
PHP_INI_END()
@ -136,9 +121,8 @@ PHP_INI_END()
/*
* Destroy a Java Virtual Machine.
*/
void jvm_destroy() {
JG_FETCH();
void jvm_destroy(TSRMLS_D)
{
if (JG(php_reflect)) (*JG(jenv))->DeleteGlobalRef(JG(jenv), JG(php_reflect));
if (JG(jvm)) {
(*JG(jvm))->DetachCurrentThread(JG(jvm));
@ -158,7 +142,8 @@ void jvm_destroy() {
*/
#ifdef JNI_12
static void addJVMOption(JavaVMInitArgs *vm_args, char *name, char *value) {
static void addJVMOption(JavaVMInitArgs *vm_args, char *name, char *value)
{
char *option = (char*) malloc(strlen(name) + strlen(value) + 1);
strcpy(option, name);
strcat(option, value);
@ -166,7 +151,8 @@ static void addJVMOption(JavaVMInitArgs *vm_args, char *name, char *value) {
}
#endif
static int jvm_create() {
static int jvm_create(TSRMLS_D)
{
int rc;
jobject local_php_reflect;
jthrowable error;
@ -185,8 +171,6 @@ static int jvm_create() {
#endif
#endif
JG_FETCH();
iniUpdated=0;
if (javalib) {
@ -276,7 +260,7 @@ static int jvm_create() {
errAsUTF = (*jenv)->GetStringUTFChars(jenv, errString, &isCopy);
php_error(E_ERROR, "%s", errAsUTF);
if (isCopy) (*jenv)->ReleaseStringUTFChars(jenv, error, errAsUTF);
jvm_destroy();
jvm_destroy(TSRMLS_C);
return -1;
}
@ -287,7 +271,8 @@ static int jvm_create() {
/***************************************************************************/
static jobject _java_makeObject(pval* arg JG_DC) {
static jobject _java_makeObject(pval* arg TSRMLS_DC)
{
JNIEnv *jenv = JG(jenv);
jobject result;
pval **handle;
@ -348,19 +333,19 @@ static jobject _java_makeObject(pval* arg JG_DC) {
/* Iterate through hash */
zend_hash_internal_pointer_reset(arg->value.ht);
while(zend_hash_get_current_data(arg->value.ht, (void**)&value) == SUCCESS) {
jval = _java_makeObject(*value JG_CC);
jval = _java_makeObject(*value TSRMLS_CC);
switch (zend_hash_get_current_key(arg->value.ht, &string_key, &num_key, 0)) {
case HASH_KEY_IS_STRING:
key.type = IS_STRING;
key.value.str.val = string_key;
key.value.str.len = strlen(string_key);
jkey = _java_makeObject(&key JG_CC);
jkey = _java_makeObject(&key TSRMLS_CC);
break;
case HASH_KEY_IS_LONG:
key.type = IS_LONG;
key.value.lval = num_key;
jkey = _java_makeObject(&key JG_CC);
jkey = _java_makeObject(&key TSRMLS_CC);
break;
default: /* HASH_KEY_NON_EXISTANT */
jkey = 0;
@ -382,7 +367,8 @@ static jobject _java_makeObject(pval* arg JG_DC) {
/***************************************************************************/
static jobjectArray _java_makeArray(int argc, pval** argv JG_DC) {
static jobjectArray _java_makeArray(int argc, pval** argv TSRMLS_DC)
{
JNIEnv *jenv = JG(jenv);
jclass objectClass = (*jenv)->FindClass(jenv, "java/lang/Object");
@ -391,14 +377,16 @@ static jobjectArray _java_makeArray(int argc, pval** argv JG_DC) {
int i;
for (i=0; i<argc; i++) {
arg = _java_makeObject(argv[i] JG_CC);
arg = _java_makeObject(argv[i] TSRMLS_CC);
(*jenv)->SetObjectArrayElement(jenv, result, i, arg);
if (argv[i]->type != IS_OBJECT) (*jenv)->DeleteLocalRef(jenv, arg);
}
return result;
}
static int checkError(pval *value) {
static int checkError(pval *value)
{
if (value->type == IS_EXCEPTION) {
php_error(E_WARNING, "%s", value->value.str.val);
efree(value->value.str.val);
@ -415,8 +403,7 @@ static int checkError(pval *value) {
* Invoke a method on an object. If method name is "java", create a new
* object instead.
*/
void java_call_function_handler
(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference)
void java_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference)
{
JNIEnv *jenv;
@ -428,12 +415,10 @@ void java_call_function_handler
jlong result = 0;
pval **arguments = (pval **) emalloc(sizeof(pval *)*arg_count);
JG_FETCH();
getParametersArray(ht, arg_count, arguments);
if (iniUpdated && JG(jenv)) jvm_destroy();
if (!JG(jenv)) jvm_create();
if (iniUpdated && JG(jenv)) jvm_destroy(TSRMLS_C);
if (!JG(jenv)) jvm_create(TSRMLS_C);
if (!JG(jenv)) return;
jenv = JG(jenv);
@ -455,7 +440,7 @@ void java_call_function_handler
className=(*jenv)->NewStringUTF(jenv, arguments[0]->value.str.val);
(*jenv)->CallVoidMethod(jenv, JG(php_reflect), co,
className, _java_makeArray(arg_count-1, arguments+1 JG_CC), result);
className, _java_makeArray(arg_count-1, arguments+1 TSRMLS_CC), result);
(*jenv)->DeleteLocalRef(jenv, className);
@ -476,7 +461,7 @@ void java_call_function_handler
result = (jlong)(long)return_value;
(*jenv)->CallVoidMethod(jenv, JG(php_reflect), invoke,
obj, method, _java_makeArray(arg_count, arguments JG_CC), result);
obj, method, _java_makeArray(arg_count, arguments TSRMLS_CC), result);
(*jenv)->DeleteLocalRef(jenv, method);
@ -495,8 +480,6 @@ PHP_FUNCTION(java_last_exception_get)
jlong result = 0;
jmethodID lastEx;
JG_FETCH();
if (ZEND_NUM_ARGS()!=0) WRONG_PARAM_COUNT;
result = (jlong)(long)return_value;
@ -514,8 +497,6 @@ PHP_FUNCTION(java_last_exception_clear)
jlong result = 0;
jmethodID clearEx;
JG_FETCH();
if (ZEND_NUM_ARGS()!=0) WRONG_PARAM_COUNT;
result = (jlong)(long)return_value;
@ -529,7 +510,7 @@ PHP_FUNCTION(java_last_exception_clear)
/***************************************************************************/
static pval _java_getset_property
(zend_property_reference *property_reference, jobjectArray value)
(zend_property_reference *property_reference, jobjectArray value TSRMLS_DC)
{
pval presult;
jlong result = 0;
@ -543,7 +524,6 @@ static pval _java_getset_property
jstring propName;
JNIEnv *jenv;
JG_FETCH();
jenv = JG(jenv);
propName = (*jenv)->NewStringUTF(jenv, property->element.value.str.val);
@ -571,22 +551,20 @@ static pval _java_getset_property
return presult;
}
pval java_get_property_handler
(zend_property_reference *property_reference)
pval java_get_property_handler(zend_property_reference *property_reference TSRMLS_DC)
{
pval presult = _java_getset_property(property_reference, 0);
pval presult = _java_getset_property(property_reference, 0 TSRMLS_CC);
checkError(&presult);
return presult;
}
int java_set_property_handler
(zend_property_reference *property_reference, pval *value)
int java_set_property_handler(zend_property_reference *property_reference, pval *value TSRMLS_DC)
{
pval presult;
JG_FETCH();
presult = _java_getset_property
(property_reference, _java_makeArray(1, &value JG_CC));
presult = _java_getset_property(property_reference, _java_makeArray(1, &value TSRMLS_CC) TSRMLS_CC);
return checkError(&presult) ? FAILURE : SUCCESS;
}
@ -596,16 +574,13 @@ static void _php_java_destructor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
void *jobject = (void *)rsrc->ptr;
JG_FETCH();
if (JG(jenv)) (*JG(jenv))->DeleteGlobalRef(JG(jenv), jobject);
}
#ifdef ZTS
static void alloc_java_globals_ctor(php_java_globals *java_globals TSRMLS_DC)
static void alloc_java_globals_ctor(zend_java_globals *java_globals TSRMLS_DC)
{
memset(java_globals, 0, sizeof(php_java_globals));
memset(java_globals, 0, sizeof(zend_java_globals));
}
#endif
PHP_MINIT_FUNCTION(java)
{
@ -623,26 +598,23 @@ PHP_MINIT_FUNCTION(java)
if (!classpath) classpath = getenv("CLASSPATH");
if (!libpath) {
TSRMLS_FETCH();
libpath=PG(extension_dir);
}
#ifdef ZTS
ts_allocate_id(&java_globals_id, sizeof(php_java_globals),
(ts_allocate_ctor)alloc_java_globals_ctor, NULL);
#endif
ZEND_INIT_MODULE_GLOBALS(java, alloc_java_globals_ctor, NULL);
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(java) {
JG_FETCH();
PHP_MSHUTDOWN_FUNCTION(java)
{
UNREGISTER_INI_ENTRIES();
if (JG(jvm)) jvm_destroy();
if (JG(jvm)) jvm_destroy(TSRMLS_C);
return SUCCESS;
}
function_entry java_functions[] = {
PHP_FE(java_last_exception_get, NULL)
PHP_FE(java_last_exception_clear, NULL)
@ -782,10 +754,9 @@ JNIEXPORT void JNICALL Java_net_php_reflect_setException
}
JNIEXPORT void JNICALL Java_net_php_reflect_setEnv
(JNIEnv *newJenv, jclass self)
(JNIEnv *newJenv, jclass self TSRMLS_DC)
{
jobject local_php_reflect;
JG_FETCH();
iniUpdated=0;
JG(jenv)=newJenv;