pollita         Wed Jul  2 18:18:59 2003 EDT

  Modified files:              
    /php-src/main/streams       php_stream_context.h streams.c 
  Log:
  Introduce connection pooling API. I'll use these in http/ftp fopen wrappers soon.
  
Index: php-src/main/streams/php_stream_context.h
diff -u php-src/main/streams/php_stream_context.h:1.6 
php-src/main/streams/php_stream_context.h:1.7
--- php-src/main/streams/php_stream_context.h:1.6       Fri Jun 27 12:23:58 2003
+++ php-src/main/streams/php_stream_context.h   Wed Jul  2 18:18:59 2003
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_stream_context.h,v 1.6 2003/06/27 16:23:58 pollita Exp $ */
+/* $Id: php_stream_context.h,v 1.7 2003/07/02 22:18:59 pollita Exp $ */
 
 /* Stream context and status notification related definitions */
 
@@ -53,6 +53,7 @@
 struct _php_stream_context {
        php_stream_notifier *notifier;
        zval *options;  /* hash keyed by wrapper family or specific wrapper */
+       zval *links;    /* hash keyed by hostent for connection pooling */
        int rsrc_id;    /* used for auto-cleanup */
 };
 
@@ -62,6 +63,13 @@
                const char *wrappername, const char *optionname, zval ***optionvalue);
 PHPAPI int php_stream_context_set_option(php_stream_context *context,
                const char *wrappername, const char *optionname, zval *optionvalue);
+
+PHPAPI int php_stream_context_get_link(php_stream_context *context,
+               const char *hostent, php_stream **stream);
+PHPAPI int php_stream_context_set_link(php_stream_context *context,
+               const char *hostent, php_stream *stream);
+PHPAPI int php_stream_context_del_link(php_stream_context *context,
+               php_stream *stream);
 
 PHPAPI php_stream_notifier *php_stream_notification_alloc(void);
 PHPAPI void php_stream_notification_free(php_stream_notifier *notifier);
Index: php-src/main/streams/streams.c
diff -u php-src/main/streams/streams.c:1.29 php-src/main/streams/streams.c:1.30
--- php-src/main/streams/streams.c:1.29 Fri Jun 27 12:23:58 2003
+++ php-src/main/streams/streams.c      Wed Jul  2 18:18:59 2003
@@ -19,7 +19,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: streams.c,v 1.29 2003/06/27 16:23:58 pollita Exp $ */
+/* $Id: streams.c,v 1.30 2003/07/02 22:18:59 pollita Exp $ */
 
 #define _GNU_SOURCE
 #include "php.h"
@@ -306,6 +306,11 @@
                zend_list_delete(stream->rsrc_id);
        }
 
+       /* Remove stream from any context link list */
+       if (stream->context && stream->context->links) {
+               php_stream_context_del_link(stream->context, stream);
+       }
+
        if (close_options & PHP_STREAM_FREE_CALL_DTOR) {
                if (release_cast && stream->fclose_stdiocast == 
PHP_STREAM_FCLOSE_FOPENCOOKIE) {
                        /* calling fclose on an fopencookied stream will ultimately
@@ -1626,6 +1631,10 @@
                php_stream_notification_free(context->notifier);
                context->notifier = NULL;
        }
+       if (context->links) {
+               zval_ptr_dtor(&context->links);
+               context->links = NULL;
+       }
        efree(context);
 }
 
@@ -1687,6 +1696,66 @@
                wrapperhash = &category;
        }
        return zend_hash_update(Z_ARRVAL_PP(wrapperhash), (char*)optionname, 
strlen(optionname)+1, (void**)&copied_val, sizeof(zval *), NULL);
+}
+
+PHPAPI int php_stream_context_get_link(php_stream_context *context,
+        const char *hostent, php_stream **stream)
+{
+       php_stream **pstream;
+
+       if (!stream || !hostent || !context || !(context->links)) {
+               return FAILURE;
+       }
+       if (SUCCESS == zend_hash_find(Z_ARRVAL_P(context->links), (char*)hostent, 
strlen(hostent)+1, (void**)&pstream)) {
+               *stream = *pstream;
+               return SUCCESS;
+       }
+       return FAILURE;
+}
+
+PHPAPI int php_stream_context_set_link(php_stream_context *context,
+        const char *hostent, php_stream *stream)
+{
+       if (!context) {
+               return FAILURE;
+       }
+       if (!context->links) {
+               ALLOC_INIT_ZVAL(context->links);
+               array_init(context->links);
+       }
+       if (!stream) {
+               /* Delete any entry for <hostent> */
+               return zend_hash_del(Z_ARRVAL_P(context->links), (char*)hostent, 
strlen(hostent)+1);
+       }
+       return zend_hash_update(Z_ARRVAL_P(context->links), (char*)hostent, 
strlen(hostent)+1, (void**)&stream, sizeof(php_stream *), NULL);
+}
+
+PHPAPI int php_stream_context_del_link(php_stream_context *context,
+        php_stream *stream)
+{
+       php_stream **pstream;
+       char *hostent;
+       int ret = SUCCESS;
+
+       if (!context || !context->links || !stream) {
+               return FAILURE;
+       }
+
+       for(zend_hash_internal_pointer_reset(Z_ARRVAL_P(context->links));
+               SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(context->links), 
(void**)&pstream);
+               zend_hash_move_forward(Z_ARRVAL_P(context->links))) {
+               if (*pstream == stream) {
+                       if (SUCCESS == 
zend_hash_get_current_key(Z_ARRVAL_P(context->links), &hostent, NULL, 0)) {
+                               if (FAILURE == 
zend_hash_del(Z_ARRVAL_P(context->links), (char*)hostent, strlen(hostent)+1)) {
+                                       ret = FAILURE;
+                               }
+                       } else {
+                               ret = FAILURE;
+                       }
+               }
+       }
+
+       return ret;
 }
 /* }}} */
 



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to