summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZach Saw <zach.saw@gmail.com>2012-11-16 09:34:36 +1100
committerZach Saw <zach.saw@gmail.com>2012-11-16 09:35:20 +1100
commit7183c8de1e163afefa52f051d2e341cc942c0f0b (patch)
tree38604a09e0472f6ef673d1198d4eecbe8c0afaab
parent54e6788a399bc3dafe947eaac7f8ffd9de783523 (diff)
downloadbdwgc-7183c8de1e163afefa52f051d2e341cc942c0f0b.tar.gz
Moved code from GC_move_disappearing_link_inner that is within
locked region to GC_move_disappearing_link_locked. Also moved DECL_LOCK_STATE from GC_unregister_disappearing_link to GC_unregister_disappearing_link_inner. * finalize.c (GC_move_disappearing_link_inner, GC_unregister_disappearing_link_inner): As described above.
-rw-r--r--finalize.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/finalize.c b/finalize.c
index 6116e1da..b62cf6f7 100644
--- a/finalize.c
+++ b/finalize.c
@@ -141,6 +141,8 @@ GC_INLINE int GC_register_disappearing_link_inner(
size_t index;
struct disappearing_link * new_dl;
+ DCL_LOCK_STATE;
+
LOCK();
GC_ASSERT(obj != NULL && GC_base_C(obj) == obj);
if (dl_hashtbl -> log_size == -1
@@ -199,8 +201,6 @@ GC_INLINE int GC_register_disappearing_link_inner(
GC_API int GC_CALL GC_general_register_disappearing_link(void * * link,
const void * obj)
{
- DCL_LOCK_STATE;
-
if (((word)link & (ALIGNMENT-1)) || link == NULL)
ABORT("Bad arg to GC_general_register_disappearing_link");
@@ -215,6 +215,8 @@ GC_INLINE int GC_unregister_disappearing_link_inner(
if (((word)link & (ALIGNMENT-1)) != 0) return(0); /* Nothing to do. */
+ DCL_LOCK_STATE;
+
LOCK();
index = HASH2(link, dl_hashtbl -> log_size);
prev_dl = 0;
@@ -243,12 +245,11 @@ GC_INLINE int GC_unregister_disappearing_link_inner(
GC_API int GC_CALL GC_unregister_disappearing_link(void * * link)
{
- DCL_LOCK_STATE;
return GC_unregister_disappearing_link_inner(&GC_dl_hashtbl, link);
}
#ifndef GC_MOVE_DISAPPEARING_LINK_NOT_NEEDED
- GC_INLINE int GC_move_disappearing_link_inner(
+ GC_INLINE int GC_move_disappearing_link_locked(
struct dl_hashtbl_s *dl_hashtbl, void **link,
void **new_link)
{
@@ -257,10 +258,6 @@ GC_API int GC_CALL GC_unregister_disappearing_link(void * * link)
word curr_hidden_link;
word new_hidden_link;
- if (((word)link & (ALIGNMENT-1)) != 0)
- return GC_NOT_FOUND; /* Nothing to do. */
-
- LOCK();
/* Find current link. */
curr_index = HASH2(link, dl_hashtbl -> log_size);
curr_hidden_link = GC_HIDE_POINTER(link);
@@ -273,12 +270,10 @@ GC_API int GC_CALL GC_unregister_disappearing_link(void * * link)
}
if (curr_dl == 0) {
- UNLOCK();
return GC_NOT_FOUND;
}
if (link == new_link) {
- UNLOCK();
return GC_SUCCESS; /* Nothing to do. */
}
@@ -289,7 +284,6 @@ GC_API int GC_CALL GC_unregister_disappearing_link(void * * link)
new_dl = dl_next(new_dl)) {
if (new_dl -> dl_hidden_link == new_hidden_link) {
/* Target already registered; bail. */
- UNLOCK();
return GC_DUPLICATE;
}
}
@@ -303,14 +297,28 @@ GC_API int GC_CALL GC_unregister_disappearing_link(void * * link)
curr_dl -> dl_hidden_link = new_hidden_link;
dl_set_next(curr_dl, dl_hashtbl -> head[new_index]);
dl_hashtbl -> head[new_index] = curr_dl;
- UNLOCK();
return GC_SUCCESS;
}
- GC_API int GC_CALL GC_move_disappearing_link(void **link, void **new_link)
+ GC_INLINE int GC_move_disappearing_link_inner(
+ struct dl_hashtbl_s *dl_hashtbl, void **link,
+ void **new_link)
{
+ int result;
+
+ if (((word)link & (ALIGNMENT-1)) != 0)
+ return GC_NOT_FOUND; /* Nothing to do. */
+
DCL_LOCK_STATE;
+ LOCK();
+ result = GC_move_disappearing_link_locked(dl_hashtbl, link, new_link);
+ UNLOCK();
+
+ return result;
+ }
+ GC_API int GC_CALL GC_move_disappearing_link(void **link, void **new_link)
+ {
if (((word)new_link & (ALIGNMENT-1)) != 0 || new_link == NULL)
ABORT("Bad new_link arg to GC_move_disappearing_link");