diff options
author | Richard Jones <rjones@redhat.com> | 2009-12-04 14:35:55 +0000 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2009-12-07 11:13:12 +0000 |
commit | cada248a53858341c91f70392e8f5b6e47d9b4fe (patch) | |
tree | f1850b3b2b5a673f59466425025c0593cd330465 /src | |
parent | 983e7a23456f413394a254f3aa4dbee271a30c47 (diff) | |
download | libguestfs-cada248a53858341c91f70392e8f5b6e47d9b4fe.tar.gz libguestfs-cada248a53858341c91f70392e8f5b6e47d9b4fe.tar.xz libguestfs-cada248a53858341c91f70392e8f5b6e47d9b4fe.zip |
lib: Add thread-safety to global list of handles.
This commit uses the Gnulib 'lock' module to implement a mutex on
the global list of handles which is stored by the library.
Note that Gnulib nicely avoids explicitly linking with -lpthread
unless the application program itself links to -lpthread. Locks
are only enabled in multithreaded applications.
$ ldd src/.libs/libguestfs.so.0.217.0
linux-vdso.so.1 => (0x00007fffcb7ff000)
libc.so.6 => /lib64/libc.so.6 (0x00007f96a4e6c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f96a544d000)
Please enter the commit message for your changes. Lines starting
Diffstat (limited to 'src')
-rw-r--r-- | src/guestfs.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/guestfs.c b/src/guestfs.c index 4c94c325..7cc09cea 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -60,12 +60,14 @@ #include <arpa/inet.h> #include <netinet/in.h> +#include "c-ctype.h" +#include "glthread/lock.h" +#include "ignore-value.h" + #include "guestfs.h" #include "guestfs-internal.h" #include "guestfs-internal-actions.h" #include "guestfs_protocol.h" -#include "c-ctype.h" -#include "ignore-value.h" #ifdef HAVE_GETTEXT #include "gettext.h" @@ -150,6 +152,7 @@ struct guestfs_h int msg_next_serial; }; +gl_lock_define_initialized (static, handles_lock); static guestfs_h *handles = NULL; static int atexit_handler_set = 0; @@ -217,17 +220,15 @@ guestfs_create (void) */ g->msg_next_serial = 0x00123400; - /* Link the handles onto a global list. This is the one area - * where the library needs to be made thread-safe. (XXX) - */ - /* acquire mutex (XXX) */ + /* Link the handles onto a global list. */ + gl_lock_lock (handles_lock); g->next = handles; handles = g; if (!atexit_handler_set) { atexit (close_handles); atexit_handler_set = 1; } - /* release mutex (XXX) */ + gl_lock_unlock (handles_lock); if (g->verbose) fprintf (stderr, "new guestfs handle %p\n", g); @@ -312,7 +313,7 @@ guestfs_close (guestfs_h *g) /* Mark the handle as dead before freeing it. */ g->state = NO_HANDLE; - /* acquire mutex (XXX) */ + gl_lock_lock (handles_lock); if (handles == g) handles = g->next; else { @@ -320,7 +321,7 @@ guestfs_close (guestfs_h *g) ; gg->next = g->next; } - /* release mutex (XXX) */ + gl_lock_unlock (handles_lock); free (g->last_error); free (g->path); |