got rid of tdb_writelock() and instead lock a chain. tdb_writelock()
authorAndrew Tridgell <tridge@samba.org>
Tue, 10 Oct 2000 06:45:09 +0000 (06:45 +0000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 10 Oct 2000 06:45:09 +0000 (06:45 +0000)
is conceptually flawed
(This used to be commit 6e4a3585521b7e5928298bd0f1418ff9fbcacfb4)

source3/include/proto.h
source3/printing/nt_printing.c
source3/printing/printing.c
source3/tdb/tdb.c

index 27fcb6a921feafd46ed45a82599a30f2203e225c..985a6efa0d73768d46bd15e598a466e3499be48e 100644 (file)
@@ -279,7 +279,6 @@ pid_t sys_fork(void);
 pid_t sys_getpid(void);
 int sys_popen(const char *command);
 int sys_pclose(int fd);
-int fcntl64(int fd, int cmd, struct flock * lock);
 
 /*The following definitions come from  lib/talloc.c  */
 
@@ -3993,13 +3992,13 @@ int tdb_store(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA dbuf, int flag);
 TDB_CONTEXT *tdb_open(char *name, int hash_size, int tdb_flags,
                      int open_flags, mode_t mode);
 int tdb_close(TDB_CONTEXT *tdb);
-int tdb_writelock(TDB_CONTEXT *tdb);
-int tdb_writeunlock(TDB_CONTEXT *tdb);
 int tdb_lockchain(TDB_CONTEXT *tdb, TDB_DATA key);
 int tdb_unlockchain(TDB_CONTEXT *tdb, TDB_DATA key);
 
 /*The following definitions come from  tdb/tdbutil.c  */
 
+int tdb_lock_bystring(TDB_CONTEXT *tdb, char *keyval);
+int tdb_unlock_bystring(TDB_CONTEXT *tdb, char *keyval);
 int tdb_fetch_int_byblob(TDB_CONTEXT *tdb, char *keyval, size_t len);
 int tdb_fetch_int(TDB_CONTEXT *tdb, char *keystr);
 int tdb_store_int_byblob(TDB_CONTEXT *tdb, char *keystr, size_t len, int v);
index 69e9233d27307a4daceac8fed64a8b3db35b4d6a..bd968c66abf0895bda08cdb92335e6253aae7c79 100644 (file)
@@ -50,6 +50,7 @@ open the NT printing tdb
 BOOL nt_printing_init(void)
 {
        static pid_t local_pid;
+       char *vstring = "INFO/version";
 
        if (tdb && local_pid == sys_getpid()) return True;
        tdb = tdb_open(lock_path("ntdrivers.tdb"), 0, 0, O_RDWR|O_CREAT, 0600);
@@ -61,12 +62,12 @@ BOOL nt_printing_init(void)
        local_pid = sys_getpid();
 
        /* handle a Samba upgrade */
-       tdb_writelock(tdb);
-       if (tdb_fetch_int(tdb, "INFO/version") != DATABASE_VERSION) {
+       tdb_lock_bystring(tdb, vstring);
+       if (tdb_fetch_int(tdb, vstring) != DATABASE_VERSION) {
                tdb_traverse(tdb, (tdb_traverse_func)tdb_delete, NULL);
-               tdb_store_int(tdb, "INFO/version", DATABASE_VERSION);
+               tdb_store_int(tdb, vstring, DATABASE_VERSION);
        }
-       tdb_writeunlock(tdb);
+       tdb_unlock_bystring(tdb, vstring);
 
        return True;
 }
index 28b5934c37c601d22945dd49f1d3f0e33db75f53..b884c5ac99a6f23f3a2413b60fc72aacaede7608 100644 (file)
@@ -68,6 +68,8 @@ Does not survive a fork
 ****************************************************************************/
 BOOL print_backend_init(void)
 {
+       char *sversion = "INFO/version";
+
        if (tdb && local_pid == sys_getpid()) return True;
        tdb = tdb_open(lock_path("printing.tdb"), 0, 0, O_RDWR|O_CREAT, 0600);
        if (!tdb) {
@@ -76,12 +78,12 @@ BOOL print_backend_init(void)
        local_pid = sys_getpid();
 
        /* handle a Samba upgrade */
-       tdb_writelock(tdb);
-       if (tdb_fetch_int(tdb, "INFO/version") != PRINT_DATABASE_VERSION) {
+       tdb_lock_bystring(tdb, sversion);
+       if (tdb_fetch_int(tdb, sversion) != PRINT_DATABASE_VERSION) {
                tdb_traverse(tdb, (tdb_traverse_func)tdb_delete, NULL);
-               tdb_store_int(tdb, "INFO/version", PRINT_DATABASE_VERSION);
+               tdb_store_int(tdb, sversion, PRINT_DATABASE_VERSION);
        }
-       tdb_writeunlock(tdb);
+       tdb_unlock_bystring(tdb, sversion);
 
        return nt_printing_init();
 }
@@ -678,7 +680,7 @@ int print_job_start(struct current_user *user, int snum, char *jobname)
        fstrcpy(pjob.qname, lp_servicename(snum));
 
        /* lock the database */
-       tdb_writelock(tdb);
+       tdb_lock_bystring(tdb, "INFO/nextjob");
 
  next_jobnum:
        next_jobid = tdb_fetch_int(tdb, "INFO/nextjob");
@@ -712,7 +714,7 @@ int print_job_start(struct current_user *user, int snum, char *jobname)
 
        print_job_store(jobid, &pjob);
 
-       tdb_writeunlock(tdb);
+       tdb_unlock_bystring(tdb, "INFO/nextjob");
 
        /*
         * If the printer is marked as postscript output a leading
@@ -732,7 +734,7 @@ int print_job_start(struct current_user *user, int snum, char *jobname)
                tdb_delete(tdb, print_key(jobid));
        }
 
-       tdb_writeunlock(tdb);
+       tdb_unlock_bystring(tdb, "INFO/nextjob");
        return -1;
 }
 
index 9c5e99e06bab81480d64f5097fa4b7b73c09b25a..45cbaf73eddbc3423c193cd07b3e73510eb8c4da 100644 (file)
@@ -1278,31 +1278,6 @@ int tdb_close(TDB_CONTEXT *tdb)
        return 0;
 }
 
-/* lock the database. If we already have it locked then don't do anything */
-int tdb_writelock(TDB_CONTEXT *tdb)
-{
-        if (tdb == NULL) {
-#ifdef TDB_DEBUG
-            printf("tdb_writelock() called with null context\n");
-#endif
-            return -1;
-        }
-
-       return tdb_lock(tdb, -1, F_WRLCK);
-}
-
-/* unlock the database. */
-int tdb_writeunlock(TDB_CONTEXT *tdb)
-{
-        if (tdb == NULL) {
-#ifdef TDB_DEBUG
-            printf("tdb_writeunlock() called with null context\n");
-#endif
-            return -1;
-        }
-
-       return tdb_unlock(tdb, -1);
-}
 
 /* lock one hash chain. This is meant to be used to reduce locking
    contention - it cannot guarantee how many records will be locked */