From: Richard Jones Date: Fri, 4 Dec 2009 14:35:55 +0000 (+0000) Subject: lib: Add thread-safety to global list of handles. X-Git-Tag: 1.0.80~10 X-Git-Url: http://git.annexia.org/?a=commitdiff_plain;h=cada248a53858341c91f70392e8f5b6e47d9b4fe;p=libguestfs.git 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 --- diff --git a/bootstrap b/bootstrap index 0f8bf20..6007e59 100755 --- a/bootstrap +++ b/bootstrap @@ -66,6 +66,7 @@ gnumakefile hash hash-pjw ignore-value +lock maintainer-makefile manywarnings netinet_in diff --git a/m4/.gitignore b/m4/.gitignore index 6b151ac..4241a4f 100644 --- a/m4/.gitignore +++ b/m4/.gitignore @@ -126,3 +126,5 @@ xsize.m4 /hash.m4 /inttostr.m4 /putenv.m4 +/thread.m4 +/yield.m4 diff --git a/src/guestfs.c b/src/guestfs.c index 4c94c32..7cc09ce 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -60,12 +60,14 @@ #include #include +#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);