diff options
author | marcus <marcus> | 2004-10-29 03:18:50 +0000 |
---|---|---|
committer | marcus <marcus> | 2004-10-29 03:18:50 +0000 |
commit | d4cc339c1ac446150b9d1b4478d9c188d28a07f0 (patch) | |
tree | 7daa1e2ee2212ccc67f36272a02bcbbf76f8474c /libhurd-cap-server | |
parent | dae49a5021702730e6276287316d53648feaa6fe (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/ChangeLog | 12 | ||||
-rw-r--r-- | libhurd-cap-server/cap-server-intern.h | 9 | ||||
-rw-r--r-- | libhurd-cap-server/cap-server.h | 22 | ||||
-rw-r--r-- | libhurd-cap-server/obj-dealloc.c | 2 |
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); |