aboutsummaryrefslogtreecommitdiff
path: root/mail/dbmail-devel/files/patch-2.0.4_bug190_pool.c
diff options
context:
space:
mode:
authorPav Lucistnik <pav@FreeBSD.org>2005-07-18 16:04:16 +0000
committerPav Lucistnik <pav@FreeBSD.org>2005-07-18 16:04:16 +0000
commit05065d99c78a53f6ab97086574a01d75be79decc (patch)
tree2f9f09b2b30cc41ccd58808030a38660205a46fb /mail/dbmail-devel/files/patch-2.0.4_bug190_pool.c
parent679f73e91c22fe170f78e55bd8ed2adf7a40849c (diff)
Notes
Diffstat (limited to 'mail/dbmail-devel/files/patch-2.0.4_bug190_pool.c')
-rw-r--r--mail/dbmail-devel/files/patch-2.0.4_bug190_pool.c126
1 files changed, 126 insertions, 0 deletions
diff --git a/mail/dbmail-devel/files/patch-2.0.4_bug190_pool.c b/mail/dbmail-devel/files/patch-2.0.4_bug190_pool.c
new file mode 100644
index 000000000000..562c0cb23688
--- /dev/null
+++ b/mail/dbmail-devel/files/patch-2.0.4_bug190_pool.c
@@ -0,0 +1,126 @@
+Index: pool.c
+===================================================================
+--- pool.c (revision 1600)
++++ pool.c (revision 1758)
+@@ -73,8 +73,10 @@
+ void scoreboard_new(serverConfig_t * conf)
+ {
+ int serr;
+- if ((shmid = shmget(IPC_PRIVATE, P_SIZE, 0644 | IPC_CREAT)) == -1)
+- trace(TRACE_FATAL, "%s,%s: shmget failed",__FILE__,__func__);
++ if ((shmid = shmget(IPC_PRIVATE, P_SIZE, 0644 | IPC_CREAT)) == -1) {
++ serr = errno;
++ trace(TRACE_FATAL, "%s,%s: shmget failed [%s]",__FILE__,__func__, strerror(serr));
++ }
+ scoreboard = shmat(shmid, (void *) 0, 0);
+ serr=errno;
+ if (scoreboard == (Scoreboard_t *) (-1)) {
+@@ -222,7 +236,7 @@
+ }
+ scoreboard_unlck();
+ trace(TRACE_FATAL,
+- "%s,%s: pid NOT found on scoreboard [%d]", __FILE__, __FUNCTION__, pid);
++ "%s,%s: pid NOT found on scoreboard [%d]", __FILE__, __func__, pid);
+ return -1;
+ }
+
+@@ -238,25 +252,25 @@
+ {
+ int i;
+ trace(TRACE_MESSAGE, "%s,%s: register child [%d]",
+- __FILE__, __FUNCTION__, getpid());
++ __FILE__, __func__, getpid());
+
+ scoreboard_wrlck();
+ for (i = 0; i < scoreboard->conf->maxChildren; i++) {
+ if (scoreboard->child[i].pid == -1)
+ break;
+ if (scoreboard->child[i].pid == getpid()) {
+- trace(TRACE_ERROR,
++ scoreboard_unlck();
++ trace(TRACE_FATAL,
+ "%s,%s: child already registered.",
+- __FILE__, __FUNCTION__);
+- scoreboard_unlck();
++ __FILE__, __func__);
+ return -1;
+ }
+ }
+ if (i == scoreboard->conf->maxChildren) {
++ scoreboard_unlck();
+ trace(TRACE_WARNING,
+ "%s,%s: no empty slot found",
+- __FILE__, __FUNCTION__);
+- scoreboard_unlck();
++ __FILE__, __func__);
+ return -1;
+ }
+
+@@ -264,8 +278,8 @@
+ scoreboard->child[i].status = STATE_IDLE;
+ scoreboard_unlck();
+
+- trace(TRACE_INFO, "%s,%s: initializing child_state [%d] using slot [%d]",
+- __FILE__, __FUNCTION__, getpid(), i);
++ trace(TRACE_MESSAGE, "%s,%s: initializing child_state [%d] using slot [%d]",
++ __FILE__, __func__, getpid(), i);
+ return 0;
+ }
+
+@@ -281,7 +295,7 @@
+ scoreboard->child[key].status = STATE_CONNECTED;
+ scoreboard_unlck();
+
+- trace(TRACE_DEBUG, "%s,%s: [%d]", __FILE__, __FUNCTION__,
++ trace(TRACE_DEBUG, "%s,%s: [%d]", __FILE__, __func__,
+ getpid());
+ }
+
+@@ -297,7 +311,7 @@
+ scoreboard->child[key].status = STATE_IDLE;
+ scoreboard_unlck();
+
+- trace(TRACE_DEBUG, "%s,%s: [%d]", __FILE__, __FUNCTION__,
++ trace(TRACE_DEBUG, "%s,%s: [%d]", __FILE__, __func__,
+ getpid());
+ }
+
+@@ -320,7 +334,7 @@
+ scoreboard_unlck();
+
+ trace(TRACE_MESSAGE,
+- "%s,%s: child [%d] unregistered", __FILE__, __FUNCTION__,
++ "%s,%s: child [%d] unregistered", __FILE__, __func__,
+ getpid());
+ }
+
+@@ -346,7 +360,7 @@
+ manage_stop_children();
+ trace(TRACE_FATAL,
+ "%s,%s: could not create children. Fatal.",
+- __FILE__, __FUNCTION__);
++ __FILE__, __func__);
+ exit(0);
+ }
+ }
+@@ -360,10 +374,17 @@
+ if (chpid == -1)
+ continue;
+ if (waitpid(chpid, NULL, WNOHANG|WUNTRACED) == chpid) {
++ scoreboard_release(chpid);
+ trace(TRACE_MESSAGE,"%s,%s: child [%d] exited. Restarting...",
+- __FILE__, __FUNCTION__, chpid);
+- scoreboard_release(chpid);
+- CreateChild(&childinfo);
++ __FILE__, __func__, chpid);
++ if (CreateChild(&childinfo)== -1) {
++ trace(TRACE_ERROR,"%s,%s: createchild failed. Bailout...",
++ __FILE__, __func__);
++ GeneralStopRequested=1;
++ manage_stop_children();
++
++ exit(1);
++ }
+ }
+ }
+ sleep(1);