[Libguestfs] [PATCH] lib: Add thread-safety to global list of handles.
Richard W.M. Jones
rjones at redhat.com
Fri Dec 4 15:32:48 UTC 2009
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming blog: http://rwmj.wordpress.com
Fedora now supports 80 OCaml packages (the OPEN alternative to F#)
http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora
-------------- next part --------------
>From 8bef0ef3f3a65360f9fa6ccebb62c21a8463d5fe Mon Sep 17 00:00:00 2001
From: Richard Jones <rjones at redhat.com>
Date: Fri, 4 Dec 2009 14:35:55 +0000
Subject: [PATCH] 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
---
bootstrap | 1 +
m4/.gitignore | 2 ++
src/guestfs.c | 19 ++++++++++---------
3 files changed, 13 insertions(+), 9 deletions(-)
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 <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);
--
1.6.5.2
More information about the Libguestfs
mailing list