sas Sat Nov 30 23:53:59 2002 EDT
Modified files:
/php4/ext/ircg ircg.c
Log:
Make error subsystem work properly in a multi-process environment
Index: php4/ext/ircg/ircg.c
diff -u php4/ext/ircg/ircg.c:1.147 php4/ext/ircg/ircg.c:1.148
--- php4/ext/ircg/ircg.c:1.147 Sat Nov 30 23:10:34 2002
+++ php4/ext/ircg/ircg.c Sat Nov 30 23:53:59 2002
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: ircg.c,v 1.147 2002/12/01 04:10:34 sas Exp $ */
+/* $Id: ircg.c,v 1.148 2002/12/01 04:53:59 sas Exp $ */
/* {{{ includes */
@@ -91,7 +91,9 @@
static struct {
ircg_hash_table h_fmt_msgs;
+ IRCG_LOCK(fmt_msgs_lock);
#define h_fmt_msgs php_ircg->h_fmt_msgs
+#define fmt_msgs_lock php_ircg->fmt_msgs_lock
/* these just serve statistical/entertainment purposes */
unsigned long irc_connects, irc_set_currents, irc_quit_handlers,
@@ -103,9 +105,14 @@
#define exec_fmt_msgs php_ircg->exec_fmt_msgs
#define exec_token_compiler php_ircg->exec_token_compiler
+ time_t next_gc;
+#define next_gc php_ircg->next_gc
- IRCG_LOCK(fmt_msgs_lock);
-#define fmt_msgs_lock php_ircg->fmt_msgs_lock
+ struct errormsg *error_msgs;
+#define error_msgs php_ircg->error_msgs
+
+ IRCG_LOCK(error_msgs_lock);
+#define error_msgs_lock php_ircg->error_msgs_lock
} *php_ircg;
/* }}} */
@@ -1146,9 +1153,6 @@
struct errormsg *next;
};
-static time_t next_gc;
-static struct errormsg *errormsgs;
-
static void error_msg_dtor(struct errormsg *m)
{
smart_str_free_ex(&m->msg, 1);
@@ -1160,10 +1164,11 @@
struct errormsg *m, *prev = NULL, *next;
time_t lim;
+ IRCG_LOCK_GET(error_msgs_lock);
lim = now - GC_INTVL;
next_gc = now + GC_INTVL;
- for (m = errormsgs; m; prev = m, m = m->next) {
+ for (m = error_msgs; m; prev = m, m = m->next) {
if (m->when < lim) {
struct errormsg *to;
/* Check whether we have subsequent outdated records */
@@ -1179,19 +1184,21 @@
if (prev)
prev->next = to;
else
- errormsgs = to;
+ error_msgs = to;
if (!to) break;
m = to;
}
}
+ IRCG_LOCK_PUT(error_msgs_lock);
}
static void add_error_msg(smart_str *msg, int msgid, php_irconn_t *conn)
{
struct errormsg *m;
- for (m = errormsgs; m; m = m->next) {
+ IRCG_LOCK_GET(error_msgs_lock);
+ for (m = error_msgs; m; m = m->next) {
if (m->id == conn->irconn_id) break;
}
@@ -1205,25 +1212,28 @@
m->msg.len = 0;
smart_str_append_ex(&m->msg, msg, 1);
m->msgid = msgid;
- m->next = errormsgs;
- errormsgs = m;
+ m->next = error_msgs;
+ error_msgs = m;
+ IRCG_LOCK_PUT(error_msgs_lock);
}
static struct errormsg *lookup_and_remove_error_msg(int id)
{
struct errormsg *m, *prev = NULL;
- for (m = errormsgs; m; prev = m, m = m->next) {
+ IRCG_LOCK_GET(error_msgs_lock);
+ for (m = error_msgs; m; prev = m, m = m->next) {
if (m->id == id) {
if (prev)
prev->next = m->next;
else
- errormsgs = m->next;
+ error_msgs = m->next;
- return m;
+ break;
}
}
- return NULL;
+ IRCG_LOCK_PUT(error_msgs_lock);
+ return m;
}
static void error_handler(irconn_t *ircc, int id, int fatal, smart_str *msg, void
*conn_data)
@@ -2269,6 +2279,7 @@
conn->login = php_ircg_now();
+ /* XXX: we take chances by assuming that wordsize read/writes are atomic */
if (conn->login >= next_gc)
error_msg_gc(conn->login);
@@ -2586,6 +2597,7 @@
memset(php_ircg, 0, sizeof *php_ircg);
IRCG_LOCK_INIT(fmt_msgs_lock);
+ IRCG_LOCK_INIT(error_msgs_lock);
for (i = 0; i < NO_FMTS; i++) {
token_compiler(fmt_msgs_default[i],
&fmt_msgs_default_compiled.fmt_msgs[i]);
@@ -2644,6 +2656,7 @@
#endif
IRCG_LOCK_DESTROY(fmt_msgs_lock);
+ IRCG_LOCK_DESTROY(error_msgs_lock);
ircg_shutdown_global();
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php