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.");
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 '';
}
}
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...");
my $read = &shmRead($key);
$read =~ s/\0+//g;
- if ($read eq "") {
+ if ($read eq '') {
$str = sprintf("%s:%d:%d: ", $param{ircUser}, $bot_pid, time());
} else {
$str = $read ."||". $str;
return if ($$ != $::bot_pid); # fork protection.
if (@_) {
- &ScheduleThis(15, "shmFlush");
- return if ($_[0] eq "2");
+ &ScheduleThis(15*60, 'shmFlush'); # 15 minutes
+ return if ($_[0] eq '2');
}
my $time;
}
}
- &shmWrite($shm,"") if ($shmmsg ne "");
+ &shmWrite($shm,'') if ($shmmsg ne '');
}
1;
+
+# vim:ts=4:sw=4:expandtab:tw=80