]> granicus.if.org Git - php/commitdiff
COM initialization/deinitialization are done only if necessary
authorDmitry Stogov <dmitry@php.net>
Fri, 17 Nov 2006 11:41:13 +0000 (11:41 +0000)
committerDmitry Stogov <dmitry@php.net>
Fri, 17 Nov 2006 11:41:13 +0000 (11:41 +0000)
ext/com_dotnet/com_com.c
ext/com_dotnet/com_dotnet.c
ext/com_dotnet/com_handlers.c
ext/com_dotnet/com_variant.c
main/main.c
main/php.h
main/php_globals.h

index 706dca6fe1bf86fa8c4f9bb892ad25737d458663..2f1745540091d38440367674a3d27f9e1678f5ea 100644 (file)
@@ -53,6 +53,7 @@ PHP_FUNCTION(com_create_instance)
                &authid, EOAC_NONE
        };
 
+       php_com_initialize(TSRMLS_C);
        obj = CDNO_FETCH(object);
 
        if (FAILURE == zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET,
@@ -294,6 +295,7 @@ PHP_FUNCTION(com_get_active_object)
        HRESULT res;
        OLECHAR *module = NULL;
 
+       php_com_initialize(TSRMLS_C);
        if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l",
                                &module_name, &module_name_len, &code_page)) {
                php_com_throw_exception(E_INVALIDARG, "Invalid arguments!" TSRMLS_CC);
@@ -660,6 +662,7 @@ PHP_FUNCTION(com_create_guid)
                ZEND_WRONG_PARAM_COUNT();
        }
 
+       php_com_initialize(TSRMLS_C);
        if (CoCreateGuid(&retval) == S_OK && StringFromCLSID(&retval, &guid_string) == S_OK) {
                Z_TYPE_P(return_value) = IS_STRING;
                Z_STRVAL_P(return_value) = php_com_olestring_to_string(guid_string, &Z_STRLEN_P(return_value), CP_ACP, 0);
@@ -688,6 +691,7 @@ PHP_FUNCTION(com_event_sink)
                RETURN_FALSE;
        }
 
+       php_com_initialize(TSRMLS_C);
        obj = CDNO_FETCH(object);
        
        if (sink && Z_TYPE_P(sink) == IS_ARRAY) {
@@ -748,6 +752,7 @@ PHP_FUNCTION(com_print_typeinfo)
                RETURN_FALSE;
        }
 
+       php_com_initialize(TSRMLS_C);
        if (Z_TYPE_P(arg1) == IS_OBJECT) {
                CDNO_FETCH_VERIFY(obj, arg1);
        } else {
@@ -778,6 +783,7 @@ PHP_FUNCTION(com_message_pump)
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &timeoutms) == FAILURE)
                RETURN_FALSE;
        
+       php_com_initialize(TSRMLS_C);
        result = MsgWaitForMultipleObjects(0, NULL, FALSE, timeoutms, QS_ALLINPUT);
 
        if (result == WAIT_OBJECT_0) {
@@ -811,6 +817,7 @@ PHP_FUNCTION(com_load_typelib)
 
        RETVAL_FALSE;
        
+       php_com_initialize(TSRMLS_C);
        pTL = php_com_load_typelib_via_cache(name, codepage, &cached TSRMLS_CC);
        if (pTL) {
                if (cached) {
index 4edeff5ac0af3acc084f9ddc73837c6cdaa2ab62..b1d63a418b62b3c1e1a780a7d96c6a10e04f2cc2 100644 (file)
@@ -193,6 +193,7 @@ PHP_FUNCTION(com_dotnet_create_instance)
        char *where = "";
        IUnknown *unk = NULL;
 
+       php_com_initialize(TSRMLS_C);
        if (COMG(dotnet_runtime_stuff) == NULL) {
                hr = dotnet_init(&where TSRMLS_CC);
                if (FAILED(hr)) {
index 57bbd7452703b8aecf48156ab531219308e6aeac..f83b5ee9f70c99c66a48ec9687ec6b154117afca 100644 (file)
@@ -667,6 +667,7 @@ zend_object_value php_com_object_new(zend_class_entry *ce TSRMLS_DC)
        php_com_dotnet_object *obj;
        zend_object_value retval;
 
+       php_com_initialize(TSRMLS_C);
        obj = emalloc(sizeof(*obj));
        memset(obj, 0, sizeof(*obj));
 
index 620ff3fa88c29bbf642dcb06bb96a8c766140933..785ad06c5410e8ef937d7952cf25797efe09befd 100644 (file)
@@ -287,6 +287,7 @@ PHP_FUNCTION(com_variant_create_instance)
                        return;
        }
 
+       php_com_initialize(TSRMLS_C);
        if (ZEND_NUM_ARGS() == 3) {
                obj->code_page = codepage;
        }
index 863372a0ea41157ef6ce4e1f81c6a37bd14e130c..5d730e0efc53576cda49b98ae231dc94149e518b 100644 (file)
@@ -1182,7 +1182,7 @@ int php_request_startup(TSRMLS_D)
        int retval = SUCCESS;
 
 #ifdef PHP_WIN32
-       CoInitialize(NULL);
+       PG(com_initialized) = 0;
 #endif
 
 #if PHP_SIGCHILD
@@ -1441,12 +1441,28 @@ void php_request_shutdown(void *dummy)
        } zend_end_try();
 
 #ifdef PHP_WIN32
-       CoUninitialize();
+       if (PG(com_initialized)) {
+               CoUninitialize();
+               PG(com_initialized) = 0;
+       }
 #endif
 }
 /* }}} */
 
 
+/* {{{ php_com_initialize
+ */
+PHPAPI void php_com_initialize(TSRMLS_D)
+{
+#ifdef PHP_WIN32
+       if (!PG(com_initialized)) {
+               CoInitialize(NULL);
+               PG(com_initialized) = 1;
+       }
+#endif
+}
+/* }}} */
+
 /* {{{ php_output_wrapper
  */
 static int php_output_wrapper(const char *str, uint str_length)
index c4070065c55a19b00400c329e69fe987c3acedf4..84bf8927a4f1a5b7ae395b4bc638decfba7d6f0f 100644 (file)
@@ -325,6 +325,8 @@ PHPAPI void php_register_pre_request_shutdown(void (*func)(void *), void *userda
 PHPAPI int cfg_get_long(char *varname, long *result);
 PHPAPI int cfg_get_double(char *varname, double *result);
 PHPAPI int cfg_get_string(char *varname, char **result);
+
+PHPAPI void php_com_initialize(TSRMLS_D);
 END_EXTERN_C()
 
 /* PHP-named Zend macro wrappers */
index 189b86fd425cc953ec1db5e5751a496eed3a193a..e313144bcb409492867e4f7159c213136836517e 100644 (file)
@@ -138,6 +138,9 @@ struct _php_core_globals {
        char *disable_functions;
        char *disable_classes;
        zend_bool allow_url_include;
+#ifdef PHP_WIN32
+       zend_bool com_initialized;
+#endif
 };