- Fixed build on php-trunk
[m6w6/ext-http] / http_request_datashare_api.c
index 870e103..1f48b7c 100644 (file)
@@ -6,7 +6,7 @@
     | modification, are permitted provided that the conditions mentioned |
     | in the accompanying LICENSE file are met.                          |
     +--------------------------------------------------------------------+
     | modification, are permitted provided that the conditions mentioned |
     | in the accompanying LICENSE file are met.                          |
     +--------------------------------------------------------------------+
-    | Copyright (c) 2004-2006, Michael Wallner <mike@php.net>            |
+    | Copyright (c) 2004-2010, Michael Wallner <mike@php.net>            |
     +--------------------------------------------------------------------+
 */
 
     +--------------------------------------------------------------------+
 */
 
 #if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL)
 
 #include "php_http_api.h"
 #if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL)
 
 #include "php_http_api.h"
+#include "php_http_persistent_handle_api.h"
 #include "php_http_request_datashare_api.h"
 #include "php_http_request_api.h"
 #include "php_http_request_object.h"
 
 #include "php_http_request_datashare_api.h"
 #include "php_http_request_api.h"
 #include "php_http_request_object.h"
 
-#ifndef HAVE_CURL_SHARE_STRERROR
-#      define curl_share_strerror(dummy) "unknown error"
-#endif
-
 static HashTable http_request_datashare_options;
 static http_request_datashare http_request_datashare_global;
 static int http_request_datashare_compare_handles(void *h1, void *h2);
 static void http_request_datashare_destroy_handles(void *el);
 #ifdef ZTS
 static HashTable http_request_datashare_options;
 static http_request_datashare http_request_datashare_global;
 static int http_request_datashare_compare_handles(void *h1, void *h2);
 static void http_request_datashare_destroy_handles(void *el);
 #ifdef ZTS
+static void *http_request_datashare_locks_init(void);
+static void http_request_datashare_locks_dtor(void *l);
 static void http_request_datashare_lock_func(CURL *handle, curl_lock_data data, curl_lock_access locktype, void *userptr);
 static void http_request_datashare_unlock_func(CURL *handle, curl_lock_data data, void *userptr);
 #endif
 static void http_request_datashare_lock_func(CURL *handle, curl_lock_data data, curl_lock_access locktype, void *userptr);
 static void http_request_datashare_unlock_func(CURL *handle, curl_lock_data data, void *userptr);
 #endif
@@ -44,6 +43,19 @@ PHP_MINIT_FUNCTION(http_request_datashare)
 {
        curl_lock_data val;
        
 {
        curl_lock_data val;
        
+       if (SUCCESS != http_persistent_handle_provide("http_request_datashare", curl_share_init, (http_persistent_handle_dtor) curl_share_cleanup, NULL)) {
+               return FAILURE;
+       }
+#ifdef ZTS
+       if (SUCCESS != http_persistent_handle_provide("http_request_datashare_lock", http_request_datashare_locks_init, http_request_datashare_locks_dtor, NULL)) {
+               return FAILURE;
+       }
+#endif
+       
+       if (!http_request_datashare_init_ex(&http_request_datashare_global, 1)) {
+               return FAILURE;
+       }
+       
        zend_hash_init(&http_request_datashare_options, 4, NULL, NULL, 1);
 #define ADD_DATASHARE_OPT(name, opt) \
        val = opt; \
        zend_hash_init(&http_request_datashare_options, 4, NULL, NULL, 1);
 #define ADD_DATASHARE_OPT(name, opt) \
        val = opt; \
@@ -53,8 +65,6 @@ PHP_MINIT_FUNCTION(http_request_datashare)
        ADD_DATASHARE_OPT("ssl", CURL_LOCK_DATA_SSL_SESSION);
        ADD_DATASHARE_OPT("connect", CURL_LOCK_DATA_CONNECT);
        
        ADD_DATASHARE_OPT("ssl", CURL_LOCK_DATA_SSL_SESSION);
        ADD_DATASHARE_OPT("connect", CURL_LOCK_DATA_CONNECT);
        
-       http_request_datashare_init_ex(&http_request_datashare_global, 1);
-       
        return SUCCESS;
 }
 
        return SUCCESS;
 }
 
@@ -89,8 +99,7 @@ PHP_HTTP_API http_request_datashare *_http_request_datashare_init_ex(http_reques
        }
        memset(share, 0, sizeof(http_request_datashare));
        
        }
        memset(share, 0, sizeof(http_request_datashare));
        
-       HTTP_CHECK_CURL_INIT(share->ch, curl_share_init(), ;);
-       if (!share->ch) {
+       if (SUCCESS != http_persistent_handle_acquire("http_request_datashare", &share->ch)) {
                if (free_share) {
                        pefree(share, persistent);
                }
                if (free_share) {
                        pefree(share, persistent);
                }
@@ -98,19 +107,15 @@ PHP_HTTP_API http_request_datashare *_http_request_datashare_init_ex(http_reques
        }
        
        if (!(share->persistent = persistent)) {
        }
        
        if (!(share->persistent = persistent)) {
-               share->handles = emalloc(sizeof(zend_llist));
-               zend_llist_init(share->handles, sizeof(zval *), ZVAL_PTR_DTOR, 0);
+               share->handle.list = emalloc(sizeof(zend_llist));
+               zend_llist_init(share->handle.list, sizeof(zval *), ZVAL_PTR_DTOR, 0);
 #ifdef ZTS
        } else {
 #ifdef ZTS
        } else {
-               int i;
-               
-               share->locks = pecalloc(CURL_LOCK_DATA_LAST, sizeof(http_request_datashare_lock), 1);
-               for (i = 0; i < CURL_LOCK_DATA_LAST; ++i) {
-                       share->locks[i].mx = tsrm_mutex_alloc();
+               if (SUCCESS == http_persistent_handle_acquire("http_request_datashare_lock", (void *) &share->handle.locks)) {
+                       curl_share_setopt(share->ch, CURLSHOPT_LOCKFUNC, http_request_datashare_lock_func);
+                       curl_share_setopt(share->ch, CURLSHOPT_UNLOCKFUNC, http_request_datashare_unlock_func);
+                       curl_share_setopt(share->ch, CURLSHOPT_USERDATA, share->handle.locks);
                }
                }
-               curl_share_setopt(share->ch, CURLSHOPT_LOCKFUNC, http_request_datashare_lock_func);
-               curl_share_setopt(share->ch, CURLSHOPT_UNLOCKFUNC, http_request_datashare_unlock_func);
-               curl_share_setopt(share->ch, CURLSHOPT_USERDATA, share);
 #endif
        }
        
 #endif
        }
        
@@ -130,8 +135,9 @@ PHP_HTTP_API STATUS _http_request_datashare_attach(http_request_datashare *share
                }
        }
        
                }
        }
        
+       HTTP_CHECK_CURL_INIT(obj->request->ch, http_curl_init_ex(obj->request->ch, obj->request), return FAILURE);
        if (CURLE_OK != (rc = curl_easy_setopt(obj->request->ch, CURLOPT_SHARE, share->ch))) {
        if (CURLE_OK != (rc = curl_easy_setopt(obj->request->ch, CURLOPT_SHARE, share->ch))) {
-               http_error_ex(HE_WARNING, HTTP_E_REQUEST, "Could not attach HttpRequest object(#%d) to the HttpRequestDataShare: %s", Z_OBJ_HANDLE_P(request), curl_share_strerror(rc));
+               http_error_ex(HE_WARNING, HTTP_E_REQUEST, "Could not attach HttpRequest object(#%d) to the HttpRequestDataShare: %s", Z_OBJ_HANDLE_P(request), curl_easy_strerror(rc));
                return FAILURE;
        }
        
                return FAILURE;
        }
        
@@ -173,18 +179,13 @@ PHP_HTTP_API void _http_request_datashare_detach_all(http_request_datashare *sha
 PHP_HTTP_API void _http_request_datashare_dtor(http_request_datashare *share TSRMLS_DC)
 {
        if (!share->persistent) {
 PHP_HTTP_API void _http_request_datashare_dtor(http_request_datashare *share TSRMLS_DC)
 {
        if (!share->persistent) {
-               zend_llist_destroy(share->handles);
-               efree(share->handles);
+               zend_llist_destroy(share->handle.list);
+               efree(share->handle.list);
        }
        }
-       curl_share_cleanup(share->ch);
+       http_persistent_handle_release("http_request_datashare", &share->ch);
 #ifdef ZTS
        if (share->persistent) {
 #ifdef ZTS
        if (share->persistent) {
-               int i;
-       
-               for (i = 0; i < CURL_LOCK_DATA_LAST; ++i) {
-                       tsrm_mutex_free(share->locks[i].mx);
-               }
-               pefree(share->locks, 1);
+               http_persistent_handle_release("http_request_datashare_lock", (void *) &share->handle.locks);
        }
 #endif
 }
        }
 #endif
 }
@@ -219,28 +220,56 @@ static void http_request_datashare_destroy_handles(void *el)
 {
        zval **r = (zval **) el;
        TSRMLS_FETCH();
 {
        zval **r = (zval **) el;
        TSRMLS_FETCH();
-       getObjectEx(http_request_object, obj, *r);
        
        
-       curl_easy_setopt(obj->request->ch, CURLOPT_SHARE, NULL);
-       zval_ptr_dtor(r);
+       { /* gcc 2.95 needs these braces */
+               getObjectEx(http_request_object, obj, *r);
+               
+               curl_easy_setopt(obj->request->ch, CURLOPT_SHARE, NULL);
+               zval_ptr_dtor(r);
+       }
 }
 
 #ifdef ZTS
 }
 
 #ifdef ZTS
+static void *http_request_datashare_locks_init(void)
+{
+       int i;
+       http_request_datashare_lock *locks = pecalloc(CURL_LOCK_DATA_LAST, sizeof(http_request_datashare_lock), 1);
+       
+       if (locks) {
+               for (i = 0; i < CURL_LOCK_DATA_LAST; ++i) {
+                       locks[i].mx = tsrm_mutex_alloc();
+               }
+       }
+       
+       return locks;
+}
+
+static void http_request_datashare_locks_dtor(void *l)
+{
+       int i;
+       http_request_datashare_lock *locks = (http_request_datashare_lock *) l;
+       
+       for (i = 0; i < CURL_LOCK_DATA_LAST; ++i) {
+               tsrm_mutex_free(locks[i].mx);
+       }
+       pefree(locks, 1);
+}
+
 static void http_request_datashare_lock_func(CURL *handle, curl_lock_data data, curl_lock_access locktype, void *userptr)
 {
 static void http_request_datashare_lock_func(CURL *handle, curl_lock_data data, curl_lock_access locktype, void *userptr)
 {
-       http_request_datashare *share = (http_request_datashare *) userptr;
+       http_request_datashare_lock *locks = (http_request_datashare_lock *) userptr;
        
        /* TSRM can't distinguish shared/exclusive locks */
        
        /* TSRM can't distinguish shared/exclusive locks */
-       tsrm_mutex_lock(share->locks[data].mx);
-       share->locks[data].ch = handle;
+       tsrm_mutex_lock(locks[data].mx);
+       locks[data].ch = handle;
 }
 
 static void http_request_datashare_unlock_func(CURL *handle, curl_lock_data data, void *userptr)
 {
 }
 
 static void http_request_datashare_unlock_func(CURL *handle, curl_lock_data data, void *userptr)
 {
-       http_request_datashare *share = (http_request_datashare *) userptr;
+       http_request_datashare_lock *locks = (http_request_datashare_lock *) userptr;
        
        
-       if (share->locks[data].ch == handle) {
-               tsrm_mutex_unlock(share->locks[data].mx);
+       if (locks[data].ch == handle) {
+               tsrm_mutex_unlock(locks[data].mx);
        }
 }
 #endif
        }
 }
 #endif