]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/rwlock.h
Change copyright as per agreement with FSFE
[bacula/bacula] / bacula / src / lib / rwlock.h
index 178410945cd470ee3d84dd3f2821e283d40ce1ad..a366202b507399230de09b9d500fb02dbab4840c 100644 (file)
@@ -1,3 +1,21 @@
+/*
+   Bacula(R) - The Network Backup Solution
+
+   Copyright (C) 2000-2016 Kern Sibbald
+
+   The original author of Bacula is Kern Sibbald, with contributions
+   from many others, a complete list can be found in the file AUTHORS.
+
+   You may use this file and others of this release according to the
+   license defined in the LICENSE file, which includes the Affero General
+   Public License, v3.0 ("AGPLv3") and some additional permissions and
+   terms pursuant to its AGPLv3 Section 7.
+
+   This notice must be preserved when any source code is 
+   conveyed and/or propagated.
+
+   Bacula(R) is a registered trademark of Kern Sibbald.
+*/
 /*
  * Bacula Thread Read/Write locking code. It permits
  *  multiple readers but only one writer.
@@ -6,23 +24,6 @@
  *
  *  This code adapted from "Programming with POSIX Threads", by
  *    David R. Butenhof
- *
- *   Version $Id$
- *
- */
-/*
-   Copyright (C) 2001-2006 Kern Sibbald
-
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License
-   version 2 as amended with additional clauses defined in the
-   file LICENSE in the main source directory.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
-   the file LICENSE for additional details.
-
  */
 
 #ifndef __RWLOCK_H
@@ -33,6 +34,7 @@ typedef struct s_rwlock_tag {
    pthread_cond_t    read;            /* wait for read */
    pthread_cond_t    write;           /* wait for write */
    pthread_t         writer_id;       /* writer's thread id */
+   int               priority;        /* used in deadlock detection */
    int               valid;           /* set when valid */
    int               r_active;        /* readers active */
    int               w_active;        /* writers active */
@@ -52,16 +54,20 @@ typedef struct s_rwsteal_tag {
    {PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, \
     PTHREAD_COND_INITIALIZER, RWLOCK_VALID, 0, 0, 0, 0}
 
+#define rwl_writelock(x)     rwl_writelock_p((x), __FILE__, __LINE__)
+
 /*
  * read/write lock prototypes
  */
-extern int rwl_init(brwlock_t *wrlock);
+extern int rwl_init(brwlock_t *wrlock, int priority=0);
 extern int rwl_destroy(brwlock_t *rwlock);
 extern int rwl_readlock(brwlock_t *rwlock);
 extern int rwl_readtrylock(brwlock_t *rwlock);
 extern int rwl_readunlock(brwlock_t *rwlock);
-extern int rwl_writelock(brwlock_t *rwlock);
+extern int rwl_writelock_p(brwlock_t *rwlock,
+                           const char *file="*unknown*", int line=0);
 extern int rwl_writetrylock(brwlock_t *rwlock);
 extern int rwl_writeunlock(brwlock_t *rwlock);
+extern bool is_rwl_valid(brwlock_t *rwl);
 
 #endif /* __RWLOCK_H */