summaryrefslogtreecommitdiff
path: root/load.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-01-13 08:23:43 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-01-13 08:23:43 +0000
commitdb02621bfbee60aa373c1b032b34dad6dcbcbd29 (patch)
tree70b15d8fe034e2ee8587cd6804be5c35290a42a9 /load.c
parenta5bfe7ca837c81e2df0329d4004fabfb4178362e (diff)
* load.c (load_unlock): update loading table at once.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34292 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'load.c')
-rw-r--r--load.c22
1 files changed, 13 insertions, 9 deletions
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);
}
}