Revision: 7255
          http://svn.sourceforge.net/mahogany/?rev=7255&view=rev
Author:   vadz
Date:     2007-04-28 17:14:01 -0700 (Sat, 28 Apr 2007)

Log Message:
-----------
implement locking functions using mutexes under Win32

Modified Paths:
--------------
    trunk/M/lib/dspam/src/config.h
    trunk/M/lib/dspam/src/hash_drv.c
    trunk/M/lib/dspam/src/hash_drv.h
    trunk/M/lib/dspam/src/util.c
    trunk/M/lib/dspam/src/util.h

Modified: trunk/M/lib/dspam/src/config.h
===================================================================
--- trunk/M/lib/dspam/src/config.h      2007-04-28 14:17:13 UTC (rev 7254)
+++ trunk/M/lib/dspam/src/config.h      2007-04-29 00:14:01 UTC (rev 7255)
@@ -105,4 +105,10 @@
 #define LLU_FMT_SPEC "llu"
 #endif
 
+#ifdef _WIN32
+typedef void *_ds_lock_t;
+#else
+typedef FILE *_ds_lock_t;
 #endif
+
+#endif

Modified: trunk/M/lib/dspam/src/hash_drv.c
===================================================================
--- trunk/M/lib/dspam/src/hash_drv.c    2007-04-28 14:17:13 UTC (rev 7254)
+++ trunk/M/lib/dspam/src/hash_drv.c    2007-04-29 00:14:01 UTC (rev 7255)
@@ -276,29 +276,23 @@
   struct _hash_drv_storage *s,
   const char *username)
 {
-  /* FIXME-WIN32: use a global mutex for locking */
-#ifdef WIN32
-  CTX; s; username;
-  return 0;
-#else
   char filename[MAX_FILENAME_LENGTH];
   int r;
 
   _ds_userdir_path(filename, CTX->home, username, "lock");
-  _ds_prepare_path_for(filename);
+  s->lock = _ds_open_lock(filename);
 
-  s->lock = fopen(filename, "a");
   if (s->lock == NULL) {
     LOG(LOG_ERR, ERR_IO_FILE_OPEN, filename, strerror(errno));
     return EFAILURE;
   }
-  r = _ds_get_fcntl_lock(fileno(s->lock));
+  r = _ds_acquire_lock(s->lock);
   if (r) {
-    fclose(s->lock);
+    _ds_close_lock(s->lock);
+    s->lock = NULL;
     LOG(LOG_ERR, ERR_IO_LOCK, filename, r, strerror(errno));
   }
   return r;
-#endif
 }
 
 int
@@ -306,25 +300,20 @@
   struct _hash_drv_storage *s, 
   const char *username)
 {
-  /* FIXME-WIN32: use a global mutex for locking */
-#ifdef WIN32
-  s; username;
-  return 0;
-#else
   int r;
 
   if (username == NULL)
     return 0;
 
-  r = _ds_free_fcntl_lock(fileno(s->lock));
+  r = _ds_release_lock(s->lock);
   if (!r) {
-    fclose(s->lock);
+    _ds_close_lock(s->lock);
+    s->lock = NULL;
   } else {
     LOG(LOG_ERR, ERR_IO_LOCK_FREE, username, r, strerror(errno));
   }
 
   return r;
-#endif
 }
 
 int _hash_drv_open(

Modified: trunk/M/lib/dspam/src/hash_drv.h
===================================================================
--- trunk/M/lib/dspam/src/hash_drv.h    2007-04-28 14:17:13 UTC (rev 7254)
+++ trunk/M/lib/dspam/src/hash_drv.h    2007-04-29 00:14:01 UTC (rev 7255)
@@ -30,6 +30,7 @@
 #include "config.h"
 #include "nodetree.h"
 #include "libdspam.h"
+#include "libdspam.h"
 
 #define HASH_REC_MAX   98317
 #define HASH_EXTENT_MAX 49157
@@ -59,7 +60,7 @@
 struct _hash_drv_storage
 {
   hash_drv_map_t map;
-  FILE *lock;
+  _ds_lock_t lock;
   int dbh_attached;
 
   unsigned long offset_nexttoken;

Modified: trunk/M/lib/dspam/src/util.c
===================================================================
--- trunk/M/lib/dspam/src/util.c        2007-04-28 14:17:13 UTC (rev 7254)
+++ trunk/M/lib/dspam/src/util.c        2007-04-29 00:14:01 UTC (rev 7255)
@@ -624,12 +624,74 @@
   return MIN(s, 1.0);
 }
 
-int _ds_get_fcntl_lock(int fd) {
 #ifdef _WIN32
-  UNUSED(fd);
 
+_ds_lock_t _ds_open_lock(const char *name)
+{
+  _ds_lock_t h;
+
+  /* the mutex name can't contain backslashes, so change them to slashes */
+  char *p,
+       *n = strdup(name);
+  for ( p = n; *p; p++ )
+  {
+    if ( *p == '\\' )
+      *p = '/';
+  } 
+
+  h = CreateMutex(NULL, FALSE, n);
+  free(n);
+
+  return h;
+}
+
+int _ds_acquire_lock(_ds_lock_t lock)
+{
+  UNUSED(lock);
+
+  /* we don't have to do anything to acquire it, we just need to check if we
+   * opened an existing mutex or created a new one */
+  return GetLastError() != ERROR_ALREADY_EXISTS;
+}
+
+int _ds_release_lock(_ds_lock_t lock)
+{
+  UNUSED(lock);
+
+  /* nothing to do */
   return 0;
-#else
+}
+
+void _ds_close_lock(_ds_lock_t lock)
+{
+  CloseHandle(lock);
+}
+
+#else /* !_WIN32 */
+
+_ds_lock_t _ds_open_lock(const char *name)
+{
+  _ds_prepare_path_for(name);
+
+  return fopen(name, "a");
+}
+
+int _ds_acquire_lock(_ds_lock_t lock)
+{
+  return _ds_get_fcntl_lock(fileno(lock));
+}
+
+int _ds_release_lock(_ds_lock_t lock)
+{
+  return _ds_free_fcntl_lock(fileno(lock));
+}
+
+void _ds_close_lock(_ds_lock_t lock)
+{
+  fclose(lock);
+}
+
+int _ds_get_fcntl_lock(int fd) {
   struct flock f;
 
   f.l_type = F_WRLCK;
@@ -638,15 +700,9 @@
   f.l_len = 0;
 
   return fcntl(fd, F_SETLKW, &f);
-#endif
 }
 
 int _ds_free_fcntl_lock(int fd) {
-#ifdef _WIN32
-  UNUSED(fd);
-
-  return 0;
-#else
   struct flock f;
                                                                                
 
   f.l_type = F_UNLCK;
@@ -655,9 +711,10 @@
   f.l_len = 0;
 
   return fcntl(fd, F_SETLKW, &f);
-#endif
 } 
 
+#endif /* _WIN32/!_WIN32 */
+
 int _ds_pow2(int exp) {
   int j = 1, i;
   if (!exp)

Modified: trunk/M/lib/dspam/src/util.h
===================================================================
--- trunk/M/lib/dspam/src/util.h        2007-04-28 14:17:13 UTC (rev 7254)
+++ trunk/M/lib/dspam/src/util.h        2007-04-29 00:14:01 UTC (rev 7255)
@@ -27,6 +27,7 @@
 #include <auto-config.h>
 #endif
 
+#include "config.h"
 #include <sys/types.h>
 
 #ifndef _WIN32
@@ -111,8 +112,31 @@
 
 double _ds_gettime(void);
 
+/*
+ * Functions for working with locks.
+ *
+ * We use lock files under Unix and named mutexes under Win32. A lock must
+ * first be opened, then an attempt to acquire it can be made and, whether it
+ * succeeded or not, it must be closed, after releasing it if we did acquire
+ * it, later.
+ */
+
+/* Initializes the object used for locking, must call _ds_close_lock() later. 
*/
+_ds_lock_t _ds_open_lock(const char *name);
+
+/* Try to acquire the lock opened by _ds_open_lock(). Return 0 on success. */
+int _ds_acquire_lock(_ds_lock_t lock);
+
+/* Release the lock acquired previously by _ds_acquire_lock() */
+int _ds_release_lock(_ds_lock_t lock);
+
+/* Close the lock object. Should release it before if we had locked it. */
+void _ds_close_lock(_ds_lock_t lock);
+
+#ifndef _WIN32
 int _ds_get_fcntl_lock  (int fd);
 int _ds_free_fcntl_lock (int fd);
+#endif
 
 unsigned long long _ds_getcrc64
   (const char *);


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Mahogany-cvsupdates mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mahogany-cvsupdates

Reply via email to