diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-01-13 08:23:43 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-01-13 08:23:43 +0000 |
commit | db02621bfbee60aa373c1b032b34dad6dcbcbd29 (patch) | |
tree | 70b15d8fe034e2ee8587cd6804be5c35290a42a9 | |
parent | a5bfe7ca837c81e2df0329d4004fabfb4178362e (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
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | load.c | 22 |
2 files changed, 17 insertions, 9 deletions
@@ -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. @@ -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); } } |