]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Shm.pl
ws
[infobot.git] / src / Shm.pl
index ab7e9964538e7549481d5489388b933993a39296..efdfced295665d79c98598e3a26facd549272e38 100644 (file)
@@ -5,6 +5,8 @@
 #   Created: 20000124
 #
 
+# use strict;  # TODO
+
 use POSIX qw(_exit);
 
 sub openSHM {
@@ -12,7 +14,7 @@ sub openSHM {
     my $size = 2000;
 
     if (&IsParam("noSHM")) {
-       &status("Created shared memory: disabled. [bot may become unreliable]");
+       &status("Shared memory: Disabled. WARNING: bot may become unreliable");
        return 0;
     }
 
@@ -46,6 +48,7 @@ sub shmRead {
     return '' if (&IsParam("noSHM"));
 
     if (shmread($key,$retval,$position,$size)) {
+       &DEBUG("shmRead($key): $retval");
        return $retval;
     } else {
        &ERROR("shmRead: failed: $!");
@@ -62,22 +65,30 @@ sub shmWrite {
 
     return if (&IsParam("noSHM"));
 
-    # NULL hack.
-    ### TODO: create shmClear to deal with this.
-    if ($str !~ /^$/) {
-       my $read = &shmRead($key);
-       $read =~ s/\0+//g;
+    if (length($str) > $size) {
+       &status("ERROR: length(str) (..)>$size...");
+       return;
+    }
 
-       if ($str eq "") {
-           $str = time().": ";         # time stamping, null.
-       } elsif ($read eq "") {
-           $str = time().": ";         # timestamping.
-       } else {
-           $str = $read ."||". $str;
+    if (length($str) == 0) {
+       # does $size overwrite the whole lot?
+       # if not, set to 2000.
+       if (!shmwrite($key, '', $position, $size)) {
+           &ERROR("shmWrite: failed: $!");
        }
+       return;
+    }
+
+    my $read = &shmRead($key);
+    $read =~ s/\0+//g;
+    if ($read eq "") {
+       $str = sprintf("%s:%d:%d: ", $param{ircNick}, $bot_pid, time());
+    } else {
+       $str = $read ."||". $str;
     }
 
-    if (!shmwrite($key,$str,$position,$size)) {
+    if (!shmwrite($key, $str, $position, $size)) {
+       &DEBUG("shmWrite($key, $str)");
        &ERROR("shmWrite: failed: $!");
     }
 }
@@ -113,13 +124,11 @@ sub addForked {
            next;
        }
 
-       # don't kill parent!
-       if ($pid == $$) {
-           &status("Fork: pid == \$\$ ($$)");
-           next;
-       }
+       if ($pid == $bot_pid) {
+           # don't kill parent, just warn.
+           &status("Fork: pid == \$bot_pid == \$\$ ($bot_pid)");
 
-       if ( -d "/proc/$pid") {
+       } elsif ( -d "/proc/$pid") {    # pid != bot_pid.
            &status("Fork: killing $name ($pid)");
            kill 9, $pid;
        }
@@ -134,10 +143,11 @@ sub addForked {
        if ($count > 3) {       # 3 seconds.
            my $list = join(', ', keys %forked);
            if (defined $who) {
-               &msg($who, "already running ($list) => exceeded allowed forked processes count (1?).");
+               &msg($who, "exceeded allowed forked count (shm $shm): $list");
            } else {
-               &status("Fork: I ran too many forked processes :) Giving up $name.");
+               &status("Fork: I ran too many forked processes :) Giving up $name. Shm: $shm");
            }
+
            return 0;
        }
 
@@ -225,9 +235,16 @@ sub shmFlush {
 
     my $time;
     my $shmmsg = &shmRead($shm);
-    $shmmsg =~ s/\0//g;         # remove padded \0's.
-    if ($shmmsg =~ s/^(\d+): //) {
-       $time   = $1;
+    # remove padded \0's.
+    $shmmsg =~ s/\0//g;
+    return if (length($shmmsg) == 0);
+    if ($shmmsg =~ s/^(\S+):(\d+):(\d+): //) {
+       my $n   = $1;
+       my $pid = $2;
+       $time   = $3;
+    } else {
+       &status("warn: shmmsg='$shmmsg'.");
+       return;
     }
 
     foreach (split '\|\|', $shmmsg) {