]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Shm.pl
- Remaining files that were changed due to removal of $noreply or
[infobot.git] / src / Shm.pl
index 713152ca95bb66115d474d25addec86ba78b0c5b..0f6f338ad9a25439dd9fb0ae2be046bb77d330b9 100644 (file)
@@ -7,6 +7,8 @@
 
 if (&IsParam("useStrict")) { use strict; }
 
+use POSIX qw(_exit);
+
 sub openSHM {
     my $IPC_PRIVATE = 0;
     my $size = 2000;
@@ -25,6 +27,8 @@ sub closeSHM {
     my ($key) = @_;
     my $IPC_RMID = 0;
 
+    return '' if (!defined $key);
+
     &shmFlush();
     &status("Closed shared memory (shm) key: [$key]");
     return shmctl($key, $IPC_RMID, 0);
@@ -62,18 +66,26 @@ sub shmWrite {
     }
 }
 
-#######
-# Helpers
-#
+##############
+### Helpers
+###
 
 # Usage: &addForked($name);
 # Return: 1 for success, 0 for failure.
 sub addForked {
-    my ($name) = @_;
+    my ($name)         = @_;
     my $forker_timeout = 360;  # 6mins, in seconds.
+    $forker            = $name;
+
+    if (!defined $name) {
+       &WARN("addForked: name == NULL.");
+       return 0;
+    }
+
+    &DEBUG("forked => ".scalar(keys %forked) );
 
     foreach (keys %forked) {
-       my $time = time() - $forked{$_};
+       my $time = time() - $forked{$_}{Time};
        next unless ($time > $forker_timeout);
 
        ### TODO: use &time2string()?
@@ -82,7 +94,7 @@ sub addForked {
     }
 
     my $count = 0;
-    while (scalar keys %forked > 2) {  # 2 or more == fail.
+    while (scalar keys %forked > 1) {  # 2 or more == fail.
        sleep 1;
 
        if ($count > 3) {       # 3 seconds.
@@ -99,35 +111,55 @@ sub addForked {
     }
 
     if (exists $forked{$name}) {
-       my $time = $forked{$name};
-       if (time() - $forked{$name} > 900) {    # stale fork > 15m.
+       my $time        = $forked{$name}{Time};
+       my $continue    = 0;
+
+       if (-d "/proc/$forked{$name}{PID}") {
+           &status("fork: still running; good. BAIL OUT.");
+       } else {
+           &WARN("Found dead fork; removing and resetting.");
+           $continue = 1;
+       }
+
+       if ($continue) {
+           # NOTHING.
+       } elsif (time() - $time > 900) {        # stale fork > 15m.
            &status("forked: forked{$name} presumably exited without notifying us.");
-           $forked{$name} = time();
-           return 1;
        } else {                                # fresh fork.
-           &msg($who, "$name is already running ". &Time2String(time() - $forked{$name}));
+           &msg($who, "$name is already running ". &Time2String(time() - $time));
            return 0;
        }
-    } else {
-       $forked{$name}  = time();
-       $forkedtime     = time();
-       $count{'Fork'}++;
-       return 1;
     }
+
+    $forked{$name}{Time}       = time();
+    $forkedtime                        = time();
+    $count{'Fork'}++;
+    return 1;
 }
 
 sub delForked {
-    my ($name) = @_;
+    my ($name) = @_;
+
+    return if ($$ == $bot_pid);
+
+    if (!defined $name) {
+       &WARN("delForked: name == NULL.");
+       POSIX::_exit(0);
+    }
+
+    &showProc();       # just for informational purposes.
 
     if (exists $forked{$name}) {
-       my $timestr = &Time2String(time() - $forked{$name});
+       my $timestr = &Time2String(time() - $forked{$name}{Time});
        &status("fork: took $timestr for $name.");
        &shmWrite($shm,"DELETE FORK $name");
-       return 1;
     } else {
        &ERROR("delForked: forked{$name} does not exist. should not happen.");
-       return 0;
     }
+
+    &status("--- fork finished for '$name' ---");
+
+    POSIX::_exit(0);
 }
 
 1;