2 * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
4 * $Id: getLock.c,v 1.3 1998/12/02 13:27:41 simonm Exp $
6 * stdin/stout/stderr Runtime Support
12 #ifdef HAVE_SYS_TYPES_H
13 #include <sys/types.h>
16 #ifdef HAVE_SYS_STAT_H
29 #define FD_SETSIZE 256
38 static Lock readLock[FD_SETSIZE];
39 static Lock writeLock[FD_SETSIZE];
41 static int readLocks = 0;
42 static int writeLocks = 0;
45 lockFile(fd, exclusive)
52 while (fstat(fd, &sb) < 0) {
58 /* Only lock regular files */
59 if (!S_ISREG(sb.st_mode))
62 for (i = 0; i < writeLocks; i++)
63 if (writeLock[i].inode == sb.st_ino && writeLock[i].device == sb.st_dev) {
70 readLock[i].device = sb.st_dev;
71 readLock[i].inode = sb.st_ino;
76 for (i = 0; i < readLocks; i++)
77 if (readLock[i].inode == sb.st_ino && readLock[i].device == sb.st_dev) {
83 writeLock[i].device = sb.st_dev;
84 writeLock[i].inode = sb.st_ino;
95 for (i = 0; i < readLocks; i++)
96 if (readLock[i].fd == fd) {
97 while (++i < readLocks)
98 readLock[i - 1] = readLock[i];
103 for (i = 0; i < writeLocks; i++)
104 if (writeLock[i].fd == fd) {
105 while (++i < writeLocks)
106 writeLock[i - 1] = writeLock[i];
110 /* Signal that we did not find an entry */
115 getLock(fd, exclusive)
119 if (lockFile(fd, exclusive) < 0) {
130 ghc_errtype = ERR_RESOURCEBUSY;
131 ghc_errstr = "file is locked";
134 /* Not so sure we want to do this, since getLock()
135 is only called on the standard file descriptors.. */
136 /*(void) close(fd); */