rcj@burl.UUCP (Curtis Jackson) (06/12/85)
Here is a crude locking mechanism for non-BSD systems. It works
quite well, and only has a \possibility/ of screwing up if 3 or
more people try to write their score out at the exact same time
(feel free to correct me via mail if you think I'm wrong on that).
Just define LOCKFILE at the top of robots.c; here is how I defined
mine:
-----------------------------------
#ifdef RCJ
#define LOCKFILE "/tmp/robotslockfile"
#endif
-----------------------------------
Then replace the function record_score() with the two functions
rmlockf() and record_score() below; I've ifdef'd out the original
code in record_score but it is still all there in case you send
this to a BSD system with flock stuff. REMEMBER TO DEFINE RCJ
WHEN YOU COMPILE (i.e., in your Makefile add a '-DRCJ' to the
cc command-line)!!
Oh, almost forgot. This version allows 15 seconds of waiting for
the lockfile to be removed before deciding that the previous robots
died while trying to write the scorefile; it then forcibly removes
the lockfile and writes its own score out. You might want to adjust
that 15 to some other number according to system load and/or taste.
-----------------------------------
#ifdef RCJ
int rmlockf(dummy)
int dummy;
{
unlink(LOCKFILE);
}
#endif
record_score(eaten,fname,max_days,type_str)
bool eaten;
char *fname;
int max_days;
char *type_str;
{
int fd;
int (*action)();
#ifndef RCJ
struct flock fl;
#endif
action = signal(SIGINT,SIG_IGN);
#ifdef RCJ
signal(SIGALRM,rmlockf);
#endif
if ((fd = open(fname,2)) < 0) {
perror(fname);
}
else {
#ifdef RCJ
alarm(15);
while (!access(LOCKFILE,04))
{
sleep(1);
}
alarm(0);
close(creat(LOCKFILE,0777));
#else
fl.l_type = F_WRLCK;
fl.l_whence = 0;
fl.l_start = 0;
fl.l_len = 0L;
fl.l_pid = getpid ();
if (fcntl (fd, F_SETLKW, &fl) < 0) {
perror(fname);
}
else {
#endif
do_score(eaten,fd,max_days,type_str);
#ifdef RCJ
unlink(LOCKFILE);
#else
fl.l_type = F_UNLCK;
(void) fcntl (fd, F_SETLK, &fl);
}
#endif
(void) close(fd);
}
(void) signal(SIGINT,action);
}
--
The MAD Programmer -- 919-228-3313 (Cornet 291)
alias: Curtis Jackson ...![ ihnp4 ulysses cbosgd mgnetp ]!burl!rcj
...![ ihnp4 cbosgd akgua masscomp ]!clyde!rcj