X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=blootbot%2Fsrc%2FShm.pl;h=0c3116bedd9c065e7d13a071a08d586d3e00496e;hb=c70f4a4c6a2f9702ca47f78020e69790280cebca;hp=ab7e9964538e7549481d5489388b933993a39296;hpb=9c1f7d111222e88d38ff6b1e565eacd67e5bc9da;p=infobot.git diff --git a/blootbot/src/Shm.pl b/blootbot/src/Shm.pl index ab7e996..0c3116b 100644 --- a/blootbot/src/Shm.pl +++ b/blootbot/src/Shm.pl @@ -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; } @@ -226,8 +236,14 @@ sub shmFlush { my $time; my $shmmsg = &shmRead($shm); $shmmsg =~ s/\0//g; # remove padded \0's. - if ($shmmsg =~ s/^(\d+): //) { - $time = $1; + 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) {