]> git.sur5r.net Git - bacula/bacula/commitdiff
Move global acquire lock to lock by device
authorKern Sibbald <kern@sibbald.com>
Sat, 15 Aug 2009 09:41:17 +0000 (11:41 +0200)
committerKern Sibbald <kern@sibbald.com>
Sat, 15 Aug 2009 19:37:37 +0000 (21:37 +0200)
bacula/src/stored/acquire.c
bacula/src/stored/dev.c
bacula/src/stored/dev.h

index 2cacabcecb4543c4eeb1982b2206b85df0a12b2f..dc3b7269c358983cddddf164cee55897348d5310 100644 (file)
@@ -333,8 +333,6 @@ get_out:
    return ok;
 }
 
-static pthread_mutex_t acquire_lock = PTHREAD_MUTEX_INITIALIZER;
-
 /*
  * Acquire device for writing. We permit multiple writers.
  *  If this is the first one, we read the label.
@@ -353,7 +351,7 @@ DCR *acquire_device_for_append(DCR *dcr)
 
    init_device_wait_timers(dcr);
 
-   P(acquire_lock);                   /* only one job at a time */
+   P(dev->acquire_mutex);           /* only one job at a time */
    dev->dlock();
    Dmsg1(100, "acquire_append device is %s\n", dev->is_tape()?"tape":
         (dev->is_dvd()?"DVD":"disk"));
@@ -423,7 +421,7 @@ DCR *acquire_device_for_append(DCR *dcr)
 get_out:
    dcr->clear_reserved();
    dev->dunlock();
-   V(acquire_lock);
+   V(dev->acquire_mutex);
    return ok ? dcr : NULL;
 }
 
index df3eaf414683b7192b8ad1bd37eb61fabdc0d2f3..eb4679f7e2b0f8d41f5f280c3570e0d2e4116b1b 100644 (file)
@@ -256,6 +256,12 @@ init_dev(JCR *jcr, DEVRES *device)
       Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.bstrerror(errstat));
       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
    }
+   if ((errstat = pthread_mutex_init(&dev->acquire_mutex, NULL)) != 0) {
+      berrno be;
+      dev->dev_errno = errstat;
+      Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.bstrerror(errstat));
+      Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
+   }
 #ifdef xxx
    if ((errstat = rwl_init(&dev->lock)) != 0) {
       berrno be;
index 51a1b1b6ae688ad5a1e9a0389f0b5ac9e7e2cac6..22734bb8052d8e80aada2fc22cc1d5ca1342278d 100644 (file)
@@ -211,17 +211,18 @@ private:
    int m_fd;                          /* file descriptor */
    int m_blocked;                     /* set if we must wait (i.e. change tape) */
    int m_count;                       /* Mutex use count -- DEBUG only */
+   int m_num_reserved;                /* counter of device reservations */
+   int32_t m_slot;                    /* slot loaded in drive or -1 if none */ 
    pthread_t m_pid;                   /* Thread that locked -- DEBUG only */
    bool m_unload;                     /* set when Volume must be unloaded */
    bool m_load;                       /* set when Volume must be loaded */
-   int m_num_reserved;                /* counter of device reservations */
-   int32_t m_slot;                    /* slot loaded in drive or -1 if none */ 
 
 public:
    DEVICE * volatile swap_dev;        /* Swap vol from this device */
    dlist *attached_dcrs;              /* attached DCR list */
    pthread_mutex_t m_mutex;           /* access control */
    pthread_mutex_t spool_mutex;       /* mutex for updating spool_size */
+   pthread_mutex_t acquire_mutex;     /* mutex for acquire code */
    pthread_cond_t wait;               /* thread wait variable */
    pthread_cond_t wait_next_vol;      /* wait for tape to be mounted */
    pthread_t no_wait_id;              /* this thread must not wait */