summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--load.c22
2 files changed, 17 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index eaa61bdf0a..410c8d70ce 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Fri Jan 13 17:23:38 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * load.c (load_unlock): update loading table at once.
+
Fri Jan 13 16:44:45 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* error.c (exc_equal): try implicit conversion for delegator.
diff --git a/load.c b/load.c
index d7debad4de..d36285fc38 100644
--- a/load.c
+++ b/load.c
@@ -416,22 +416,26 @@ load_lock(const char *ftptr)
return (char *)ftptr;
}
+static int
+release_barrier(st_data_t key, st_data_t *value, st_data_t done)
+{
+ VALUE barrier = (VALUE)*value;
+ if (done ? rb_barrier_destroy(barrier) : rb_barrier_release(barrier)) {
+ /* still in-use */
+ return ST_CONTINUE;
+ }
+ xfree((char *)key);
+ return ST_DELETE;
+}
+
static void
load_unlock(const char *ftptr, int done)
{
if (ftptr) {
st_data_t key = (st_data_t)ftptr;
- st_data_t data;
st_table *loading_tbl = get_loading_table();
- VALUE barrier;
- if (!st_lookup(loading_tbl, key, &data)) return;
- barrier = (VALUE)data;
- if (!(done ? rb_barrier_destroy(barrier) : rb_barrier_release(barrier))) {
- if (st_delete(loading_tbl, &key, &data)) {
- xfree((char *)key);
- }
- }
+ st_update(loading_tbl, key, release_barrier, done);
}
}