sas Tue Dec 3 09:14:34 2002 EDT
Modified files:
/php4/ext/ircg ircg.c php_ircg_private.h
Log:
further work on stabilizing concurrent IRCG accesses
Index: php4/ext/ircg/ircg.c
diff -u php4/ext/ircg/ircg.c:1.150 php4/ext/ircg/ircg.c:1.151
--- php4/ext/ircg/ircg.c:1.150 Tue Dec 3 05:13:36 2002
+++ php4/ext/ircg/ircg.c Tue Dec 3 09:14:33 2002
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: ircg.c,v 1.150 2002/12/03 10:13:36 sas Exp $ */
+/* $Id: ircg.c,v 1.151 2002/12/03 14:14:33 sas Exp $ */
/* {{{ includes */
@@ -67,6 +67,15 @@
#include "ext/standard/php_smart_str.h"
#include "php_ircg_private.h"
+#ifdef USE_IRCONN_MANAGEMENT
+static HashTable h_irconn; /* Integer IDs to php_irconn_t * */
+static int irconn_id;
+#endif
+
+#ifdef USE_FD2IRCONN
+static HashTable h_fd2irconn; /* fd's to Integer IDs */
+#endif
+
struct php_ircg_global *php_ircg;
/* initialized in the IRCG control process, so that we can avoid locking */
@@ -181,7 +190,10 @@
struct sockaddr_in sin; /* address of stream conn */
#endif
php_fmt_msgs_t *fmt_msgs;
+#if IRCG_API_VERSION < 20021127
irc_write_buf wb;
+#endif
+ irc_write_buf *wbp;
ircg_hash_table ctcp_msgs;
#ifdef IRCG_PENDING_URL
@@ -352,7 +364,7 @@
shutdown(conn->fd, 2);
#endif
if (conn->file_fd == -1 && conn->fd >= 0)
- irc_write_buf_del(&conn->wb);
+ irc_write_buf_del(conn->wbp);
}
if (conn->file_fd != -1) {
smart_str m = {0};
@@ -381,6 +393,7 @@
}
#endif
+ memset(conn, 0xbb, sizeof *conn);
IRCG_SHARED_FREE(conn);
}
/* }}} */
@@ -453,7 +466,7 @@
goto done;
default:
#if IRCG_API_VERSION - 0 >= 20010601
- if ((n = irc_write_buf_append_ex(&conn->wb, msg, 0))) {
+ if ((n = irc_write_buf_append_ex(conn->wbp, msg, 0))) {
const char *reason;
#if IRCG_API_VERSION - 0 >= 20020308
@@ -481,10 +494,10 @@
}
return;
#elif IRCG_API_VERSION - 0 >= 20010302
- irc_write_buf_append_ex(&conn->wb, msg, 0); /* no copy */
+ irc_write_buf_append_ex(conn->wbp, msg, 0); /* no copy */
return;
#else
- irc_write_buf_append(&conn->wb, msg);
+ irc_write_buf_append(conn->wbp, msg);
goto done;
#endif
break;
@@ -499,7 +512,7 @@
{
msg_accum_send(conn, msg);
if (conn->fd >= 0 && conn->file_fd == -1)
- irc_write_buf_flush(&conn->wb);
+ irc_write_buf_flush(conn->wbp);
}
static void msg_replay_buffer(php_irconn_t *conn)
@@ -882,8 +895,8 @@
smart_str tmp = {0};
smart_str_setl(&tmp, " ", 2);
- irc_write_buf_append_ex(&conn->wb, &tmp, 1);
- irc_write_buf_flush(&conn->wb);
+ irc_write_buf_append_ex(conn->wbp, &tmp, 1);
+ irc_write_buf_flush(conn->wbp);
} else if (conn->file_fd < 0
&& (php_ircg_now() - conn->login) > WINDOW_TIMEOUT) {
char buf[1024];
@@ -1037,6 +1050,13 @@
}
/* }}} */
+static void wbuf_destruct(irc_write_buf *p)
+{
+ php_ircg->irc_wbuf_destructs++;
+ memset(p, 0xaa, sizeof(*p));
+ IRCG_SHARED_FREE(p);
+}
+
/* {{{ proto bool ircg_set_current(int connection)
Sets current connection for output */
PHP_FUNCTION(ircg_set_current)
@@ -1059,11 +1079,9 @@
ircg_hash_index_del(&h_fd2irconn, conn->fd);
#endif
if (conn->file_fd == -1)
- irc_write_buf_del(&conn->wb);
+ irc_write_buf_del(conn->wbp);
conn->fd = -1;
}
-
- php_ircg->irc_set_currents++;
if (php_ircg_register_with_sapi(&conn->fd TSRMLS_CC)
#ifdef USE_FD2IRCONN
@@ -1081,7 +1099,15 @@
sizeof(int), NULL);
#endif
if (conn->file_fd == -1 && conn->fd >= 0) {
- irc_write_buf_add(&conn->wb, conn->fd);
+#if IRCG_API_VERSION < 20021127
+ conn->wbp = &conn->wb;
+ irc_write_buf_add(conn->wbp, conn->fd);
+#else
+ conn->wbp = IRCG_SHARED_ALLOC(sizeof(irc_write_buf));
+ irc_write_buf_add_ex(conn->wbp, conn->fd, wbuf_destruct);
+#endif
+
+ php_ircg->irc_set_currents++;
IRCGG(flush_data) = conn;
}
RETVAL_TRUE;
@@ -2056,7 +2082,7 @@
#endif
msg_replay_buffer(conn);
- irc_write_buf_flush(&conn->wb);
+ irc_write_buf_flush(conn->wbp);
}
return SUCCESS;
@@ -2183,10 +2209,12 @@
php_info_print_table_row(2, "Tokenizer invocations", buf);
sprintf(buf, "%lu", php_ircg->irc_connects);
php_info_print_table_row(2, "IRC connects", buf);
- sprintf(buf, "%lu", php_ircg->irc_set_currents);
- php_info_print_table_row(2, "Persistent HTTP connections", buf);
sprintf(buf, "%lu", php_ircg->irc_quit_handlers);
php_info_print_table_row(2, "Terminated IRC connections", buf);
+ sprintf(buf, "%lu", php_ircg->irc_set_currents);
+ php_info_print_table_row(2, "Persistent HTTP connections", buf);
+ sprintf(buf, "%lu", php_ircg->irc_wbuf_destructs);
+ php_info_print_table_row(2, "Write buffer destructs", buf);
php_info_print_table_end();
}
/* }}} */
Index: php4/ext/ircg/php_ircg_private.h
diff -u php4/ext/ircg/php_ircg_private.h:1.1 php4/ext/ircg/php_ircg_private.h:1.2
--- php4/ext/ircg/php_ircg_private.h:1.1 Tue Dec 3 05:13:36 2002
+++ php4/ext/ircg/php_ircg_private.h Tue Dec 3 09:14:33 2002
@@ -8,12 +8,7 @@
#if IRCG_API_VERSION < 20021127
#define USE_IRCONN_MANAGEMENT
-static HashTable h_irconn; /* Integer IDs to php_irconn_t * */
-static int irconn_id;
-
#define USE_FD2IRCONN
-static HashTable h_fd2irconn; /* fd's to Integer IDs */
-
/* provide dummy definitions */
#include "php_ircg_hash.h"
@@ -32,7 +27,8 @@
/* these just serve statistical/entertainment purposes */
unsigned long irc_connects, irc_set_currents, irc_quit_handlers,
- exec_fmt_msgs, exec_token_compiler;
+ exec_fmt_msgs, exec_token_compiler,
+ irc_wbuf_destructs;
unsigned long cache_hits, cache_misses;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php