]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/rwlock.c
First cut of bat rerun a Job from Jobs Run
[bacula/bacula] / bacula / src / lib / rwlock.c
index c4d5262e36f8d3ba5a973476152095b4eb163ead..b1ce1e2e9827e0a2f2853d33382e1a5bca8c7d62 100644 (file)
@@ -1,12 +1,12 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2001-2008 Free Software Foundation Europe e.V.
+   Copyright (C) 2001-2010 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    This program is Free Software; you can redistribute it and/or
-   modify it under the terms of version two of the GNU General Public
+   modify it under the terms of version three of the GNU Affero General Public
    License as published by the Free Software Foundation and included
    in the file LICENSE.
 
@@ -15,7 +15,7 @@
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Affero General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
@@ -40,6 +40,7 @@
  *
  */
 
+#define _LOCKMGR_COMPLIANT
 #include "bacula.h"
 
 /*
  *  Returns: 0 on success
  *           errno on failure
  */
-int rwl_init(brwlock_t *rwl)
+int rwl_init(brwlock_t *rwl, int priority)
 {
    int stat;
 
    rwl->r_active = rwl->w_active = 0;
    rwl->r_wait = rwl->w_wait = 0;
+   rwl->priority = priority;
    if ((stat = pthread_mutex_init(&rwl->mutex, NULL)) != 0) {
       return stat;
    }
@@ -217,7 +219,7 @@ int rwl_readunlock(brwlock_t *rwl)
  * Lock for write access, wait until locked (or error).
  *   Multiple nested write locking is permitted.
  */
-int rwl_writelock(brwlock_t *rwl)
+int rwl_writelock_p(brwlock_t *rwl, const char *file, int line)
 {
    int stat;
 
@@ -232,11 +234,13 @@ int rwl_writelock(brwlock_t *rwl)
       pthread_mutex_unlock(&rwl->mutex);
       return 0;
    }
+   lmgr_pre_lock(rwl, rwl->priority, file, line);
    if (rwl->w_active || rwl->r_active > 0) {
       rwl->w_wait++;                  /* indicate that we are waiting */
       pthread_cleanup_push(rwl_write_release, (void *)rwl);
       while (rwl->w_active || rwl->r_active > 0) {
          if ((stat = pthread_cond_wait(&rwl->write, &rwl->mutex)) != 0) {
+            lmgr_do_unlock(rwl);
             break;                    /* error, bail out */
          }
       }
@@ -246,7 +250,8 @@ int rwl_writelock(brwlock_t *rwl)
    if (stat == 0) {
       rwl->w_active++;                /* we are running */
       rwl->writer_id = pthread_self(); /* save writer thread's id */
-   }
+      lmgr_post_lock();
+   } 
    pthread_mutex_unlock(&rwl->mutex);
    return stat;
 }
@@ -274,6 +279,7 @@ int rwl_writetrylock(brwlock_t *rwl)
    } else {
       rwl->w_active = 1;              /* we are running */
       rwl->writer_id = pthread_self(); /* save writer thread's id */
+      lmgr_do_lock(rwl, rwl->priority, __FILE__, __LINE__);
    }
    stat2 = pthread_mutex_unlock(&rwl->mutex);
    return (stat == 0 ? stat2 : stat);
@@ -305,6 +311,7 @@ int rwl_writeunlock(brwlock_t *rwl)
    if (rwl->w_active > 0) {
       stat = 0;                       /* writers still active */
    } else {
+      lmgr_do_unlock(rwl);
       /* No more writers, awaken someone */
       if (rwl->r_wait > 0) {         /* if readers waiting */
          stat = pthread_cond_broadcast(&rwl->read);
@@ -454,7 +461,7 @@ int main (int argc, char *argv[])
     for (data_count = 0; data_count < DATASIZE; data_count++) {
         data[data_count].data = 0;
         data[data_count].writes = 0;
-        status = rwl_init (&data[data_count].lock);
+        status = rwl_init(&data[data_count].lock);
         if (status != 0) {
            berrno be;
            printf("Init rwlock failed. ERR=%s\n", be.bstrerror(status));
@@ -567,7 +574,7 @@ void *thread_routine (void *arg)
     int iteration;
     int element;
     int status;
-
+    lmgr_init_thread();
     element = 0;                        /* Current data element */
 
     for (iteration = 0; iteration < ITERATIONS; iteration++) {
@@ -601,6 +608,7 @@ void *thread_routine (void *arg)
         if (element >= DATASIZE)
             element = 0;
     }
+    lmgr_cleanup_thread();
     return NULL;
 }
 
@@ -627,7 +635,7 @@ int main (int argc, char *argv[])
     for (data_count = 0; data_count < DATASIZE; data_count++) {
         data[data_count].data = 0;
         data[data_count].updates = 0;
-        rwl_init (&data[data_count].lock);
+        rwl_init(&data[data_count].lock);
     }
 
     /*