Implement flock in WinBoard
authorH.G. Muller <h.g.muller@hccnet.nl>
Mon, 2 May 2011 11:38:14 +0000 (13:38 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Wed, 4 May 2011 16:40:47 +0000 (18:40 +0200)
This system function seems unknown in a MinGW compile, so it is
implemented with the aid of file byte-range locking, using a lock on the
first 1024 bytes of the file as a semaphore.

backend.c
winboard/winboard.c

index d68df79..f6e75c4 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -57,6 +57,9 @@
 
 #define DoSleep( n ) if( (n) != 0 ) Sleep( (n) );
 
+int flock(int f, int code);
+#define LOCK_EX 2
+
 #else
 
 #define DoSleep( n ) if( (n) >= 0) sleep(n)
index 3938cf2..4d823eb 100644 (file)
@@ -73,6 +73,7 @@
 #include <richedit.h>\r
 #include <mmsystem.h>\r
 #include <ctype.h>\r
+#include <io.h>\r
 \r
 #if __GNUC__\r
 #include <errno.h>\r
@@ -9783,3 +9784,19 @@ SettingsPopUp(ChessProgramState *cps)
 {     // [HGM] wrapper needed because handles must not be passed through back-end\r
       EngineOptionsPopup(savedHwnd, cps);\r
 }\r
+\r
+int flock(int fid, int code)\r
+{\r
+    HANDLE hFile = (HANDLE) _get_osfhandle(fid);\r
+    OVERLAPPED ov;\r
+    ov.hEvent = NULL;\r
+    ov.Offset = 0;\r
+    ov.OffsetHigh = 0;\r
+    switch(code) {\r
+      case 1: LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1024, 0, &ov); break;   // LOCK_SH\r
+      case 2: LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1024, 0, &ov); break;   // LOCK_EX\r
+      case 3: UnlockFileEx(hFile, 0, 1024, 0, &ov); break; // LOCK_UN\r
+      default: return -1;\r
+    }\r
+    return 0;\r
+}\r