sas Mon Dec 9 07:42:28 2002 EDT
Added files:
/php4/ext/ircg php_ircg_formats.h
Modified files:
/php4/ext/ircg ircg.c php_ircg_private.h php_ircg_tokenizer.h
Log:
It is now possible to run 'apachectl restart' even if PHP
and/or the IRCG extension are a shared module.
In those cases, the heap will be initialized to zero during
a restart, so we basically lose all state information,
including pointers to already allocated data structures.
We compensate that by introducing a separate area manager
which maintains a id => ptr mapping. That manager can be
queried through a UNIX domain socket, so that the newly
loaded DSO (which still has the shared memory segment
attached) can ask the manager for the pointers.
Index: php4/ext/ircg/ircg.c
diff -u php4/ext/ircg/ircg.c:1.158 php4/ext/ircg/ircg.c:1.159
--- php4/ext/ircg/ircg.c:1.158 Fri Dec 6 01:52:47 2002
+++ php4/ext/ircg/ircg.c Mon Dec 9 07:42:28 2002
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: ircg.c,v 1.158 2002/12/06 06:52:47 sas Exp $ */
+/* $Id: ircg.c,v 1.159 2002/12/09 12:42:28 sas Exp $ */
/* {{{ includes */
@@ -83,44 +83,6 @@
/* }}} */
-/* {{{ Format string numbers */
-enum {
- FMT_MSG_CHAN = 0,
- FMT_MSG_PRIV_TO_ME,
- FMT_MSG_PRIV_FROM_ME,
- FMT_MSG_LEAVE,
- FMT_MSG_JOIN,
- FMT_MSG_KICK,
- FMT_MSG_TOPIC,
- FMT_MSG_ERROR,
- FMT_MSG_FATAL_ERROR,
- FMT_MSG_JOIN_LIST_END,
- FMT_MSG_SELF_PART,
- FMT_MSG_NICK,
- FMT_MSG_QUIT,
- FMT_MSG_MASS_JOIN_BEGIN,
- FMT_MSG_MASS_JOIN_ELEMENT,
- FMT_MSG_MASS_JOIN_END,
- FMT_MSG_WHOIS_USER,
- FMT_MSG_WHOIS_SERVER,
- FMT_MSG_WHOIS_IDLE,
- FMT_MSG_WHOIS_CHANNEL,
- FMT_MSG_WHOIS_END,
- FMT_MSG_MODE_VOICE,
- FMT_MSG_MODE_OP,
- FMT_MSG_BANLIST,
- FMT_MSG_BANLIST_END,
- FMT_MSG_DISCONNECTED,
- FMT_MSG_LIST,
- FMT_MSG_LISTEND,
- FMT_MSG_WHOREPLY1,
- FMT_MSG_WHOREPLY2,
- FMT_MSG_ENDOFWHO,
- FMT_MSG_INVITE,
- NO_FMTS
-};
-/* }}} */
-
/* {{{ ircg_functions[] */
function_entry ircg_functions[] = {
#ifdef IRCG_PENDING_URL
@@ -177,10 +139,6 @@
#endif
typedef struct {
- format_msg_t *fmt_msgs[NO_FMTS];
-} php_fmt_msgs_t;
-
-typedef struct {
irconn_t conn;
smart_str buffer;
time_t login;
@@ -209,7 +167,6 @@
char *realname; /* dito */
} php_irconn_t;
-static php_fmt_msgs_t fmt_msgs_default_compiled;
#define format_msg php_ircg_format_msg
@@ -1754,7 +1711,7 @@
}
if (!fmt_msgs)
- fmt_msgs = &fmt_msgs_default_compiled;
+ fmt_msgs = &php_ircg->fmt_msgs_default_compiled;
/*
* conn must be able to live longer than the hash entry in h_irconn,
@@ -2126,20 +2083,23 @@
#endif
/* }}} */
-static void setup(int stage)
+static int init(void *p)
{
- if (stage == 0) {
- int i;
+ int i;
- php_ircg = IRCG_SHARED_ALLOC(sizeof *php_ircg);
- memset(php_ircg, 0, sizeof *php_ircg);
-
- IRCG_LOCK_INIT(php_ircg->fmt_msgs_lock);
- IRCG_LOCK_INIT(php_ircg->error_msgs_lock);
+ IRCG_LOCK_INIT(php_ircg->fmt_msgs_lock);
+ IRCG_LOCK_INIT(php_ircg->error_msgs_lock);
- for (i = 0; i < NO_FMTS; i++) {
- php_ircg_token_compiler(fmt_msgs_default[i],
&fmt_msgs_default_compiled.fmt_msgs[i]);
- }
+ for (i = 0; i < NO_FMTS; i++) {
+ php_ircg_token_compiler(fmt_msgs_default[i],
+&php_ircg->fmt_msgs_default_compiled.fmt_msgs[i]);
+ }
+ return 0;
+}
+
+static void setup(int stage)
+{
+ if (stage == 0) {
+ ircg_fetch_area("php-ircg-main", &php_ircg, sizeof *php_ircg, init);
} else if (stage == 1) {
php_ircg_cache_entries = malloc(sizeof(struct cache_entry) *
NR_CACHE_ENTRIES);
memset(php_ircg_cache_entries, 0, sizeof(struct cache_entry) *
NR_CACHE_ENTRIES);
Index: php4/ext/ircg/php_ircg_private.h
diff -u php4/ext/ircg/php_ircg_private.h:1.4 php4/ext/ircg/php_ircg_private.h:1.5
--- php4/ext/ircg/php_ircg_private.h:1.4 Wed Dec 4 04:53:20 2002
+++ php4/ext/ircg/php_ircg_private.h Mon Dec 9 07:42:28 2002
@@ -10,6 +10,8 @@
#define USE_IRCONN_MANAGEMENT
#define USE_FD2IRCONN
+#define ircg_fetch_area(name, ptr, size, fn) do { *(ptr) = IRCG_SHARED_ALLOC((size));
+memset(*(ptr), 0, (size)); (fn)(*(ptr)); } while (0)
+
/* provide dummy definitions */
#include "php_ircg_hash.h"
#include "php_ircg_lock.h"
@@ -22,6 +24,13 @@
#include "php_ircg_error.h"
+#include "php_ircg_tokenizer.h"
+#include "php_ircg_formats.h"
+
+typedef struct {
+ format_msg_t *fmt_msgs[NO_FMTS];
+} php_fmt_msgs_t;
+
struct php_ircg_global {
ircg_hash_table h_fmt_msgs;
@@ -38,6 +47,8 @@
struct errormsg *error_msgs;
IRCG_LOCK(error_msgs_lock);
+
+ php_fmt_msgs_t fmt_msgs_default_compiled;
};
extern struct php_ircg_global *php_ircg;
Index: php4/ext/ircg/php_ircg_tokenizer.h
diff -u php4/ext/ircg/php_ircg_tokenizer.h:1.1 php4/ext/ircg/php_ircg_tokenizer.h:1.2
--- php4/ext/ircg/php_ircg_tokenizer.h:1.1 Tue Dec 3 05:13:36 2002
+++ php4/ext/ircg/php_ircg_tokenizer.h Mon Dec 9 07:42:28 2002
@@ -1,3 +1,6 @@
+#ifndef PHP_IRCG_TOKENIZER_H
+#define PHP_IRCG_TOKENIZER_H
+
#include "ext/standard/php_smart_str_public.h"
typedef struct {
@@ -9,7 +12,7 @@
} para;
} token_t;
-typedef struct {
+typedef struct format_msg {
int ntoken;
token_t t[1];
} format_msg_t;
@@ -46,3 +49,4 @@
void php_ircg_free_fmt_msg(format_msg_t *f);
+#endif
Index: php4/ext/ircg/php_ircg_formats.h
+++ php4/ext/ircg/php_ircg_formats.h
/* {{{ Format string numbers */
enum {
FMT_MSG_CHAN = 0,
FMT_MSG_PRIV_TO_ME,
FMT_MSG_PRIV_FROM_ME,
FMT_MSG_LEAVE,
FMT_MSG_JOIN,
FMT_MSG_KICK,
FMT_MSG_TOPIC,
FMT_MSG_ERROR,
FMT_MSG_FATAL_ERROR,
FMT_MSG_JOIN_LIST_END,
FMT_MSG_SELF_PART,
FMT_MSG_NICK,
FMT_MSG_QUIT,
FMT_MSG_MASS_JOIN_BEGIN,
FMT_MSG_MASS_JOIN_ELEMENT,
FMT_MSG_MASS_JOIN_END,
FMT_MSG_WHOIS_USER,
FMT_MSG_WHOIS_SERVER,
FMT_MSG_WHOIS_IDLE,
FMT_MSG_WHOIS_CHANNEL,
FMT_MSG_WHOIS_END,
FMT_MSG_MODE_VOICE,
FMT_MSG_MODE_OP,
FMT_MSG_BANLIST,
FMT_MSG_BANLIST_END,
FMT_MSG_DISCONNECTED,
FMT_MSG_LIST,
FMT_MSG_LISTEND,
FMT_MSG_WHOREPLY1,
FMT_MSG_WHOREPLY2,
FMT_MSG_ENDOFWHO,
FMT_MSG_INVITE,
NO_FMTS
};
/* }}} */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php