|
|
1.1 root 1: #include "decl.h"
2: #include <signal.h>
3:
4: static lockcount = 0;
5: static SIG_TYP intsav, quitsav, hupsav, pipesave, termsav;
6:
7: void
8: lock (Path& dir)
9: {
10: Path com = dir & "L." + String(dec(getpid()));
11: int snooze = 0;
12:
13: if (lockcount++ == 0) {
14: intsav = signal (SIGINT, SIG_IGN);
15: quitsav = signal (SIGQUIT, SIG_IGN);
16: hupsav = signal (SIGHUP, SIG_IGN);
17: pipesave = signal (SIGPIPE, SIG_IGN);
18: termsav = signal (SIGTERM, SIG_IGN);
19: }
20:
21: int fd;
22: if ((fd = creat (com, 0)) < 0) {
23: cout << "cannot create lock file " << com << "\n";
24: exit (1);
25: }
26: close (fd);
27:
28: while (link (com, dir & "lock") < 0)
29: sleep (snooze++);
30: }
31:
32: void
33: unlock (Path& dir)
34: {
35: unlink (dir & "L." + String(dec(getpid())));
36: unlink (dir & "lock");
37:
38: if (--lockcount == 0) {
39: signal (SIGINT, intsav);
40: signal (SIGQUIT, quitsav);
41: signal (SIGHUP, hupsav);
42: signal (SIGPIPE, pipesave);
43: signal (SIGTERM, termsav);
44: }
45: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.