summaryrefslogtreecommitdiff
path: root/load.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-12-14 01:20:11 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-12-14 01:20:11 +0000
commitf2fff83e96fe5faea36354993602195881ee8ba3 (patch)
tree36e76ff6d2283559a20c37a4c5f3f59c0cb48f70 /load.c
parentaa432d233491abc0d5e271f8e73345edb49348b7 (diff)
* load.c (load_lock): delete the loading barrier if it has been
destroyed. * thread.c (rb_barrier_wait): return nil for recursive lock instead of false, to distinguish it from destroyed barrier. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34036 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'load.c')
-rw-r--r--load.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/load.c b/load.c
index 9d389f9efb..2672051727 100644
--- a/load.c
+++ b/load.c
@@ -405,7 +405,15 @@ load_lock(const char *ftptr)
rb_warning("loading in progress, circular require considered harmful - %s", ftptr);
rb_backtrace();
}
- return RTEST(rb_barrier_wait((VALUE)data)) ? (char *)ftptr : 0;
+ switch (rb_barrier_wait((VALUE)data)) {
+ case Qfalse:
+ data = (st_data_t)ftptr;
+ st_delete(loading_tbl, &data, 0);
+ return 0;
+ case Qnil:
+ return 0;
+ }
+ return (char *)ftptr;
}
static void