]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Shm.pl
* Replaced chanServ_ops in infobot.config with chansetable +chanServCheck
[infobot.git] / src / Shm.pl
index ae7e84283317b71b658b5c2d7e10d31e6f5acfbe..0484ff2e2c34e2f2a2021443bf4d2a6e8e3f714e 100644 (file)
@@ -9,17 +9,23 @@
 
 use POSIX qw(_exit);
 
+my %shm_keys;
+
 sub openSHM {
     my $IPC_PRIVATE = 0;
     my $size = 2000;
 
-    if (&IsParam("noSHM")) {
+    if (&IsParam('noSHM')) {
        &status("Shared memory: Disabled. WARNING: bot may become unreliable");
        return 0;
     }
 
     if (defined( $_ = shmget($IPC_PRIVATE, $size, 0777) )) {
        &status("Created shared memory (shm) key: [$_]");
+       $shm_keys{$_} = {time     => time,
+                        accessed => 0,
+                        key      => $_,
+                       };
        return $_;
     } else {
        &ERROR("openSHM: failed.");
@@ -45,14 +51,19 @@ sub shmRead {
     my $size = 3*80;
     my $retval = '';
 
-    return '' if (&IsParam("noSHM"));
+    return '' if (&IsParam('noSHM'));
 
     if (shmread($key,$retval,$position,$size)) {
+       #&DEBUG("shmRead($key): $retval");
        return $retval;
     } else {
        &ERROR("shmRead: failed: $!");
+       if (exists $shm_keys{$_}) {
+             closeSHM($key);
+       }
        ### TODO: if this fails, never try again.
-       &openSHM();
+       # What use is opening a SHM segment if we're not going to read it?
+       # &openSHM();
        return '';
     }
 }
@@ -62,7 +73,9 @@ sub shmWrite {
     my $position = 0;
     my $size = 80*3;
 
-    return if (&IsParam("noSHM"));
+    return if (&IsParam('noSHM'));
+
+    $shm_keys{$keys}{accessed} = 1;
 
     if (length($str) > $size) {
        &status("ERROR: length(str) (..)>$size...");
@@ -80,13 +93,14 @@ sub shmWrite {
 
     my $read = &shmRead($key);
     $read =~ s/\0+//g;
-    if ($read eq "") {
-       $str = sprintf("%s:%d:%d: ", $param{ircNick}, $bot_pid, time());
+    if ($read eq '') {
+       $str = sprintf("%s:%d:%d: ", $param{ircUser}, $bot_pid, time());
     } else {
        $str = $read ."||". $str;
     }
 
-    if (!shmwrite($key, '', $position, $size)) {
+    if (!shmwrite($key, $str, $position, $size)) {
+       &DEBUG("shmWrite($key, $str)");
        &ERROR("shmWrite: failed: $!");
     }
 }
@@ -141,9 +155,9 @@ sub addForked {
        if ($count > 3) {       # 3 seconds.
            my $list = join(', ', keys %forked);
            if (defined $who) {
-               &msg($who, "exceeded allowed forked count: $list");
+               &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;
@@ -227,13 +241,14 @@ sub shmFlush {
     return if ($$ != $::bot_pid); # fork protection.
 
     if (@_) {
-       &ScheduleThis(5, "shmFlush");
-       return if ($_[0] eq "2");
+       &ScheduleThis(15*60, 'shmFlush'); # 15 minutes
+       return if ($_[0] eq '2');
     }
 
     my $time;
     my $shmmsg = &shmRead($shm);
-    $shmmsg =~ s/\0//g;         # remove padded \0's.
+    # remove padded \0's.
+    $shmmsg =~ s/\0//g;
     return if (length($shmmsg) == 0);
     if ($shmmsg =~ s/^(\S+):(\d+):(\d+): //) {
        my $n   = $1;
@@ -269,7 +284,9 @@ sub shmFlush {
        }
     }
 
-    &shmWrite($shm,"") if ($shmmsg ne "");
+    &shmWrite($shm,'') if ($shmmsg ne '');
 }
 
 1;
+
+# vim:ts=4:sw=4:expandtab:tw=80