if (&IsParam("useStrict")) { use strict; }
+use POSIX qw(_exit);
+
sub openSHM {
my $IPC_PRIVATE = 0;
my $size = 2000;
my ($key) = @_;
my $IPC_RMID = 0;
+ return '' if (!defined $key);
+
&shmFlush();
&status("Closed shared memory (shm) key: [$key]");
return shmctl($key, $IPC_RMID, 0);
}
}
-#######
-# Helpers
-#
+##############
+### Helpers
+###
# Usage: &addForked($name);
# Return: 1 for success, 0 for failure.
sub addForked {
- my ($name) = @_;
+ my ($name) = @_;
my $forker_timeout = 360; # 6mins, in seconds.
+ $forker = $name;
+
+ if (!defined $name) {
+ &WARN("addForked: name == NULL.");
+ return 0;
+ }
+
+ &DEBUG("forked => ".scalar(keys %forked) );
foreach (keys %forked) {
- my $time = time() - $forked{$_};
+ my $time = time() - $forked{$_}{Time};
next unless ($time > $forker_timeout);
### TODO: use &time2string()?
}
my $count = 0;
- while (scalar keys %forked > 2) { # 2 or more == fail.
+ while (scalar keys %forked > 1) { # 2 or more == fail.
sleep 1;
if ($count > 3) { # 3 seconds.
}
if (exists $forked{$name}) {
- my $time = $forked{$name};
- if (time() - $forked{$name} > 900) { # stale fork > 15m.
+ my $time = $forked{$name}{Time};
+ my $continue = 0;
+
+ if (-d "/proc/$forked{$name}{PID}") {
+ &status("fork: still running; good. BAIL OUT.");
+ } else {
+ &WARN("Found dead fork; removing and resetting.");
+ $continue = 1;
+ }
+
+ if ($continue) {
+ # NOTHING.
+ } elsif (time() - $time > 900) { # stale fork > 15m.
&status("forked: forked{$name} presumably exited without notifying us.");
- $forked{$name} = time();
- return 1;
} else { # fresh fork.
- &msg($who, "$name is already running ". &Time2String(time() - $forked{$name}));
+ &msg($who, "$name is already running ". &Time2String(time() - $time));
return 0;
}
- } else {
- $forked{$name} = time();
- $forkedtime = time();
- $count{'Fork'}++;
- return 1;
}
+
+ $forked{$name}{Time} = time();
+ $forkedtime = time();
+ $count{'Fork'}++;
+ return 1;
}
sub delForked {
- my ($name) = @_;
+ my ($name) = @_;
+
+ return if ($$ == $bot_pid);
+
+ if (!defined $name) {
+ &WARN("delForked: name == NULL.");
+ POSIX::_exit(0);
+ }
+
+ &showProc(); # just for informational purposes.
if (exists $forked{$name}) {
- my $timestr = &Time2String(time() - $forked{$name});
+ my $timestr = &Time2String(time() - $forked{$name}{Time});
&status("fork: took $timestr for $name.");
&shmWrite($shm,"DELETE FORK $name");
- return 1;
} else {
&ERROR("delForked: forked{$name} does not exist. should not happen.");
- return 0;
}
+
+ &status("--- fork finished for '$name' ---");
+
+ POSIX::_exit(0);
}
1;