diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-02-26 07:43:11 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-02-26 07:43:11 +0000 |
commit | eeb804f153eff4bde9fc528414bfd9c8c8e343a1 (patch) | |
tree | 07f08eec5e3161b54324f0bdbe38f9ac4ed42f1c | |
parent | ba2d46829afada0ecc878df16b04078b13c6cfd9 (diff) |
*** empty log message ***
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@92 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | lib/thread.rb | 48 | ||||
-rw-r--r-- | parse.y | 28 | ||||
-rw-r--r-- | version.h | 2 |
3 files changed, 66 insertions, 12 deletions
diff --git a/lib/thread.rb b/lib/thread.rb index 5262ec539d..c33333f5f3 100644 --- a/lib/thread.rb +++ b/lib/thread.rb @@ -69,9 +69,37 @@ class Mutex unlock end end +end - def num_waiting - @waiting.size +class ConditionVariable + def initialize + @waiters = [] + @waiters_mutex = Mutex.new + end + + def wait(mutex) + mutex.unlock + @waiters_mutex.synchronize { + @waiters.push(Thread.current) + } + Thread.stop + mutex.lock + end + + def signal + @waiters_mutex.synchronize { + t = @waiters.shift + t.run if t + } + end + + def broadcast + @waiters_mutex.synchronize { + for t in @waiters + t.run + end + @waiters.clear + } end end @@ -116,6 +144,11 @@ class Queue @que.length end alias size length + + + def num_waiting + @waiting.size + end end class SizedQueue<Queue @@ -130,19 +163,20 @@ class SizedQueue<Queue end def max=(max) + Thread.critical = TRUE if @max >= max @max = max + Thread.critical = FALSE else - Thread.critical = TRUE diff = max - @max @max = max + Thread.critical = FALSE diff.times do t = @queue_wait.shift t.run if t end - Thread.critical = FALSE - @max end + max end def push(obj) @@ -150,6 +184,7 @@ class SizedQueue<Queue while @que.length >= @max @queue_wait.push Thread.current Thread.stop + Thread.critical = true end super end @@ -160,8 +195,7 @@ class SizedQueue<Queue t = @queue_wait.shift t.run if t end - pop = super - pop + super end def num_waiting @@ -485,6 +485,11 @@ fname : IDENTIFIER lex_state = EXPR_END; $$ = $1; } + | reswords + { + lex_state = EXPR_END; + $$ = $<id>1; + } undef_list : fname { @@ -523,6 +528,14 @@ op : DOT2 { $$ = DOT2; } | ASET { $$ = ASET; } | '`' { $$ = '`'; } +reswords : k__LINE__ | k__FILE__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE | kCLASS | kDEF + | kDEFINED | kDO | kELSE | kELSIF | kEND | kENSURE | kFALSE + | kFOR | kIF_MOD | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF | kSUPER + | kTHEN | kTRUE | kUNDEF | kUNLESS_MOD | kUNTIL_MOD | kWHEN + | kWHILE_MOD | kYIELD + arg : variable '=' arg { value_expr($3); @@ -2586,12 +2599,16 @@ retry: case ':': c = nextc(); if (c == ':') { - if (lex_state == EXPR_BEG || - (lex_state == EXPR_ARG && space_seen)) { + if (lex_state == EXPR_BEG) { lex_state = EXPR_BEG; return COLON3; } - lex_state = EXPR_BEG; + if (lex_state == EXPR_ARG && space_seen) { + arg_ambiguous(); + lex_state = EXPR_BEG; + return COLON3; + } + lex_state = EXPR_DOT; return COLON2; } pushback(c); @@ -2877,12 +2894,15 @@ retry: result = IVAR; break; default: - if (lex_state != EXPR_FNAME && lex_state != EXPR_DOT) { + if (lex_state != EXPR_DOT) { /* See if it is a reserved word. */ kw = rb_reserved_word(tok(), toklen()); if (kw) { enum lex_state state = lex_state; lex_state = kw->state; + if (lex_state == EXPR_FNAME) { + yylval.id = rb_intern(kw->name); + } return kw->id[state != EXPR_BEG]; } } @@ -1,2 +1,2 @@ -#define RUBY_VERSION "1.1b8" +#define RUBY_VERSION "1.1b8_00" #define VERSION_DATE "98/02/20" |