sas             Fri Dec  6 01:08:59 2002 EDT

  Modified files:              
    /php4/ext/ircg      ircg.c 
  Log:
  added a hook-registration function similiar to irc_connect() for
  the write buffer. we register a callback for closed-conn notification
  and an async handler for write_buf_add completion, so that we
  can maintain proper reference counts.
  
  we also call the global IRCG init function only once. this proves to 
  be successful all the time and even apachectl restart/graceful works
  beautifully now.
  
  
Index: php4/ext/ircg/ircg.c
diff -u php4/ext/ircg/ircg.c:1.156 php4/ext/ircg/ircg.c:1.157
--- php4/ext/ircg/ircg.c:1.156  Thu Dec  5 10:35:04 2002
+++ php4/ext/ircg/ircg.c        Fri Dec  6 01:08:59 2002
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: ircg.c,v 1.156 2002/12/05 15:35:04 sas Exp $ */
+/* $Id: ircg.c,v 1.157 2002/12/06 06:08:59 sas Exp $ */
 
 /* {{{ includes */
 
@@ -1047,11 +1047,24 @@
 }
 /* }}} */
 
-static void wbuf_dead(irc_write_buf *p, void *data)
+static void wbuf_closed_conn(irc_write_buf *p, void *data)
 {
        irc_disconnect(data, "Client connection terminated");
 }
 
+static void wbuf_add_complete(irc_write_buf *p, void *data)
+{
+       php_irconn_t *conn = data;
+
+       put_irconn(data);
+}
+
+static void wbuf_hooks(irc_write_buf *p, void *data)
+{
+       irc_write_buf_reg(p, WB_CLOSED_CONN, wbuf_closed_conn);
+       irc_write_buf_reg(p, WB_ADD_COMPLETE, wbuf_add_complete);
+}
+
 /* {{{ proto bool ircg_set_current(int connection)
    Sets current connection for output */
 PHP_FUNCTION(ircg_set_current)
@@ -1099,7 +1112,8 @@
                        irc_write_buf_add(&conn->wb, conn->fd);
                        if (1) {
 #else
-                       if (irc_write_buf_add_ex(&conn->wb, conn->fd, wbuf_dead, conn) 
== 0) {
+                       if (irc_write_buf_add_ex(&conn->wb, conn->fd, wbuf_hooks, 
+conn) == 0) {
+                               ircg_resource_get(conn->irconn_id);
 #endif
                                php_ircg->irc_set_currents++;
                                IRCGG(flush_data) = conn;
@@ -2135,7 +2149,7 @@
        }
 }
 
-static pid_t initialized_from;
+static int initialized;
 
 /* {{{ PHP_MINIT_FUNCTION
  */
@@ -2157,14 +2171,16 @@
        }
 #endif
        
-       initialized_from = getpid();
        
+       if (initialized == 0) {
+               initialized = 1;
 #if IRCG_API_VERSION >= 20021127
-       ircg_setup_global("/tmp/ircg.lock", 0, setup);
+               ircg_setup_global("/tmp/ircg.lock", 0, setup);
 #else
-       setup(0);
-       setup(1);
+               setup(0);
+               setup(1);
 #endif
+       }
        
        ircg_hash_init(&php_ircg->h_fmt_msgs, 0, NULL, fmt_msgs_dtor, 1);
 #ifdef USE_FD2IRCONN   
@@ -2188,15 +2204,6 @@
        ircg_hash_destroy(&h_fd2irconn);
 #endif
 
-       if (getpid() == initialized_from) {
-               ircg_hash_destroy(&php_ircg->h_fmt_msgs);
-
-               IRCG_LOCK_DESTROY(php_ircg->fmt_msgs_lock);
-               IRCG_LOCK_DESTROY(php_ircg->error_msgs_lock);
-
-               ircg_shutdown_global();
-       }
-       
        return SUCCESS;
 }
 /* }}} */



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

Reply via email to