use POSIX qw(_exit);
+my %shm_keys;
+
sub openSHM {
my $IPC_PRIVATE = 0;
my $size = 2000;
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.");
return '' if (&IsParam("noSHM"));
if (shmread($key,$retval,$position,$size)) {
- &DEBUG("shmRead($key): $retval");
+ #&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 '';
}
}
return if (&IsParam("noSHM"));
+ $shm_keys{$keys}{accessed} = 1;
+
if (length($str) > $size) {
&status("ERROR: length(str) (..)>$size...");
return;
my $read = &shmRead($key);
$read =~ s/\0+//g;
if ($read eq "") {
- $str = sprintf("%s:%d:%d: ", $param{ircNick}, $bot_pid, time());
+ $str = sprintf("%s:%d:%d: ", $param{ircUser}, $bot_pid, time());
} else {
$str = $read ."||". $str;
}
return if ($$ != $::bot_pid); # fork protection.
if (@_) {
- &ScheduleThis(5, "shmFlush");
+ &ScheduleThis(15, "shmFlush");
return if ($_[0] eq "2");
}