2 # Shm.pl: Shared Memory stuff.
8 if (&IsParam("useStrict")) { use strict; }
14 if (defined( $_ = shmget($IPC_PRIVATE, $size, 0777) )) {
15 &status("Created shared memory (shm) key: [$_]");
18 &ERROR("openSHM: failed.");
19 &ERROR("Please delete some shared memory with ipcs or ipcrm.");
29 &status("Closed shared memory (shm) key: [$key]");
30 return shmctl($key, $IPC_RMID, 0);
39 if (shmread($key,$retval,$position,$size)) {
42 &ERROR("shmRead: failed: $!");
53 ### TODO: create shmClear to deal with this.
55 my $read = &shmRead($key);
57 $str = $read ."||". $str if ($read ne "");
60 if (!shmwrite($key,$str,$position,$size)) {
61 &ERROR("shmWrite: failed: $!");
69 # Usage: &addForked($name);
70 # Return: 1 for success, 0 for failure.
73 my $forker_timeout = 360; # 6mins, in seconds.
75 foreach (keys %forked) {
76 my $time = time() - $forked{$_};
77 next unless ($time > $forker_timeout);
79 ### TODO: use &time2string()?
80 &WARN("Fork: looks like we lost '$_', executed $time ago.");
85 while (scalar keys %forked > 2) { # 2 or more == fail.
88 if ($count > 3) { # 3 seconds.
89 my $list = join(', ', keys %forked);
91 &msg($who, "already running ($list) => exceeded allowed forked processes count (1?).");
93 &status("Fork: I ran too many forked processes :) Giving up $name.");
101 if (exists $forked{$name}) {
102 my $time = $forked{$name};
103 if (time() - $forked{$name} > 900) { # stale fork > 15m.
104 &status("forked: forked{$name} presumably exited without notifying us.");
105 $forked{$name} = time();
107 } else { # fresh fork.
108 &msg($who, "$name is already running ". &Time2String(time() - $forked{$name}));
112 $forked{$name} = time();
113 $forkedtime = time();
122 if (exists $forked{$name}) {
123 my $timestr = &Time2String(time() - $forked{$name});
124 &status("fork: took $timestr for $name.");
125 &shmWrite($shm,"DELETE FORK $name");
128 &ERROR("delForked: forked{$name} does not exist. should not happen.");