summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2009-12-04 14:35:55 +0000
committerRichard Jones <rjones@redhat.com>2009-12-07 11:13:12 +0000
commitcada248a53858341c91f70392e8f5b6e47d9b4fe (patch)
treef1850b3b2b5a673f59466425025c0593cd330465 /src
parent983e7a23456f413394a254f3aa4dbee271a30c47 (diff)
downloadlibguestfs-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.c19
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);