mirror of
https://github.com/php/php-src.git
synced 2025-08-17 06:28:50 +02:00
more ZTS fixes.
This commit is contained in:
parent
e7ea61ad98
commit
474da88b4c
7 changed files with 168 additions and 239 deletions
127
ext/java/java.c
127
ext/java/java.c
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue