summaryrefslogtreecommitdiff
path: root/libhurd-cap-server
diff options
context:
space:
mode:
authormarcus <marcus>2004-10-29 03:18:50 +0000
committermarcus <marcus>2004-10-29 03:18:50 +0000
commitd4cc339c1ac446150b9d1b4478d9c188d28a07f0 (patch)
tree7daa1e2ee2212ccc67f36272a02bcbbf76f8474c /libhurd-cap-server
parentdae49a5021702730e6276287316d53648feaa6fe (diff)
2004-10-29 Marcus Brinkmann <marcus@gnu.org>
* cap-server.h: Include <atomic.h>. (struct hurd_cap_obj): Change type of member refs from unsigned int to uatomic32_t. (hurd_cap_obj_ref): Use atomic_increment(). (hurd_cap_obj_rele): Use atomic_decrement(). * cap-server-intern.h (_hurd_cap_obj_drop): Remove unused variable cap_class. Use atomic_decrement_and_test. * obj-dealloc.c (_hurd_cap_obj_dealloc): Assert that OBJ->refs is 0, not 1. Do not unlock the object.
Diffstat (limited to 'libhurd-cap-server')
-rw-r--r--libhurd-cap-server/ChangeLog12
-rw-r--r--libhurd-cap-server/cap-server-intern.h9
-rw-r--r--libhurd-cap-server/cap-server.h22
-rw-r--r--libhurd-cap-server/obj-dealloc.c2
4 files changed, 26 insertions, 19 deletions
diff --git a/libhurd-cap-server/ChangeLog b/libhurd-cap-server/ChangeLog
index ef9c175..58cb488 100644
--- a/libhurd-cap-server/ChangeLog
+++ b/libhurd-cap-server/ChangeLog
@@ -1,3 +1,15 @@
+2004-10-29 Marcus Brinkmann <marcus@gnu.org>
+
+ * cap-server.h: Include <atomic.h>.
+ (struct hurd_cap_obj): Change type of member refs
+ from unsigned int to uatomic32_t.
+ (hurd_cap_obj_ref): Use atomic_increment().
+ (hurd_cap_obj_rele): Use atomic_decrement().
+ * cap-server-intern.h (_hurd_cap_obj_drop): Remove unused variable
+ cap_class. Use atomic_decrement_and_test.
+ * obj-dealloc.c (_hurd_cap_obj_dealloc): Assert that OBJ->refs is
+ 0, not 1. Do not unlock the object.
+
2004-10-25 Marcus Brinkmann <marcus@gnu.org>
* Makefile.am (libhurd_cap_server_a_SOURCES): Add
diff --git a/libhurd-cap-server/cap-server-intern.h b/libhurd-cap-server/cap-server-intern.h
index d9b5ff8..a7787ba 100644
--- a/libhurd-cap-server/cap-server-intern.h
+++ b/libhurd-cap-server/cap-server-intern.h
@@ -114,13 +114,8 @@ void _hurd_cap_obj_dealloc (hurd_cap_obj_t obj)
static inline void
_hurd_cap_obj_drop (hurd_cap_obj_t obj)
{
- hurd_cap_class_t cap_class = obj->cap_class;
-
- if (__builtin_expect (obj->refs > 1, 1))
- {
- hurd_cap_obj_rele (obj);
- hurd_cap_obj_unlock (obj);
- }
+ if (__builtin_expect (!atomic_decrement_and_test (&obj->refs), 1))
+ hurd_cap_obj_unlock (obj);
else
_hurd_cap_obj_dealloc (obj);
}
diff --git a/libhurd-cap-server/cap-server.h b/libhurd-cap-server/cap-server.h
index 6b79c44..ce56619 100644
--- a/libhurd-cap-server/cap-server.h
+++ b/libhurd-cap-server/cap-server.h
@@ -26,6 +26,10 @@
#include <errno.h>
#include <pthread.h>
+/* FIXME: This is not a public header file! So we may have to ship
+ a <hurd/atomic.h>. */
+#include <atomic.h>
+
#include <hurd/slab.h>
#include <hurd/types.h>
@@ -213,7 +217,7 @@ struct hurd_cap_obj
pthread_mutex_t lock;
/* The reference counter for this object. */
- unsigned int refs;
+ uatomic32_t refs;
/* The state of this object. If this is _HURD_CAP_STATE_GREEN, you
can use the capability object. Otherwise, you should refrain
@@ -351,22 +355,18 @@ hurd_cap_obj_unlock (hurd_cap_obj_t obj)
static inline void
hurd_cap_obj_ref (hurd_cap_obj_t obj)
{
- assert (obj->refs < UINT_MAX);
-
- obj->refs++;
+ atomic_increment (&obj->refs);
}
-/* Remove one reference for the capability object OBJ, which must be
- locked. Note that the caller must have at least two references for
- this capability object when using this function. To release the
- last reference, hurd_cap_obj_drop must be used instead. */
+/* Remove one reference for the capability object OBJ. Note that the
+ caller must have at least two references for this capability object
+ when using this function. To release the last reference,
+ hurd_cap_obj_drop must be used instead. */
static inline void
hurd_cap_obj_rele (hurd_cap_obj_t obj)
{
- assert (obj->refs > 1);
-
- obj->refs--;
+ atomic_decrement (&obj->refs);
}
diff --git a/libhurd-cap-server/obj-dealloc.c b/libhurd-cap-server/obj-dealloc.c
index b0abb55..de4421e 100644
--- a/libhurd-cap-server/obj-dealloc.c
+++ b/libhurd-cap-server/obj-dealloc.c
@@ -40,7 +40,7 @@ _hurd_cap_obj_dealloc (hurd_cap_obj_t obj)
(*cap_class->obj_reinit) (cap_class, obj);
/* Now do our part of the reinitialization. */
- assert (obj->refs == 1);
+ assert (obj->refs == 0);
assert (obj->state == _HURD_CAP_STATE_GREEN);
assert (obj->pending_rpcs == NULL);
assert (obj->clients == NULL);