thread_critical bug reported by Dave - matz

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1085 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2000-12-29 02:46:12 +00:00
parent 08ec02b92b
commit 2cafd39ed2
5 changed files with 14 additions and 11 deletions

View File

@ -1355,8 +1355,7 @@ rb_ary_eql(ary1, ary2)
long i; long i;
if (TYPE(ary2) != T_ARRAY) return Qfalse; if (TYPE(ary2) != T_ARRAY) return Qfalse;
if (RARRAY(ary1)->len != RARRAY(ary2)->len) if (RARRAY(ary1)->len != RARRAY(ary2)->len) return Qfalse;
return Qfalse;
for (i=0; i<RARRAY(ary1)->len; i++) { for (i=0; i<RARRAY(ary1)->len; i++) {
if (!rb_eql(RARRAY(ary1)->ptr[i], RARRAY(ary2)->ptr[i])) if (!rb_eql(RARRAY(ary1)->ptr[i], RARRAY(ary2)->ptr[i]))
return Qfalse; return Qfalse;

13
eval.c
View File

@ -7354,6 +7354,7 @@ void
rb_thread_wait_fd(fd) rb_thread_wait_fd(fd)
int fd; int fd;
{ {
if (rb_thread_critical) return;
if (curr_thread == curr_thread->next) return; if (curr_thread == curr_thread->next) return;
if (curr_thread->status == THREAD_TO_KILL) return; if (curr_thread->status == THREAD_TO_KILL) return;
@ -7367,6 +7368,7 @@ int
rb_thread_fd_writable(fd) rb_thread_fd_writable(fd)
int fd; int fd;
{ {
if (rb_thread_critical) return Qtrue;
if (curr_thread == curr_thread->next) return Qtrue; if (curr_thread == curr_thread->next) return Qtrue;
if (curr_thread->status == THREAD_TO_KILL) return Qtrue; if (curr_thread->status == THREAD_TO_KILL) return Qtrue;
@ -7387,7 +7389,8 @@ rb_thread_wait_for(time)
{ {
double date; double date;
if (curr_thread == curr_thread->next || if (rb_thread_critical ||
curr_thread == curr_thread->next ||
curr_thread->status == THREAD_TO_KILL) { curr_thread->status == THREAD_TO_KILL) {
int n; int n;
#ifndef linux #ifndef linux
@ -7452,7 +7455,8 @@ rb_thread_select(max, read, write, except, timeout)
(double)timeout->tv_sec+(double)timeout->tv_usec*1e-6; (double)timeout->tv_sec+(double)timeout->tv_usec*1e-6;
} }
if (curr_thread == curr_thread->next || if (rb_thread_critical ||
curr_thread == curr_thread->next ||
curr_thread->status == THREAD_TO_KILL) { curr_thread->status == THREAD_TO_KILL) {
#ifndef linux #ifndef linux
struct timeval tv, *tvp = timeout; struct timeval tv, *tvp = timeout;
@ -7518,6 +7522,7 @@ rb_thread_join(thread)
rb_thread_t th = rb_thread_check(thread); rb_thread_t th = rb_thread_check(thread);
enum thread_status last_status = THREAD_RUNNABLE; enum thread_status last_status = THREAD_RUNNABLE;
if (rb_thread_critical) rb_thread_deadlock();
if (!rb_thread_dead(th)) { if (!rb_thread_dead(th)) {
if (th == curr_thread) if (th == curr_thread)
rb_raise(rb_eThreadError, "thread tried to join itself"); rb_raise(rb_eThreadError, "thread tried to join itself");
@ -7617,8 +7622,8 @@ rb_thread_kill(thread)
rb_thread_ready(th); rb_thread_ready(th);
th->gid = 0; th->gid = 0;
th->status = THREAD_TO_KILL; th->status = THREAD_TO_KILL;
rb_thread_schedule(); if (!rb_thread_critical) rb_thread_schedule();
return Qnil; /* not reached */ return thread;
} }
static VALUE static VALUE

View File

@ -103,11 +103,9 @@ static int duppair proto((char *, datum));
/* /*
* externals * externals
*/ */
#ifndef sun #if !defined(sun) && !defined(MSDOS) && !defined(_WIN32)
#ifndef MSDOS
extern int errno; extern int errno;
#endif #endif
#endif
/* /*
* forward * forward

View File

@ -90,6 +90,7 @@ static VALUE
range_eq(range, obj) range_eq(range, obj)
VALUE range, obj; VALUE range, obj;
{ {
if (range == obj) return Qtrue;
if (!rb_obj_is_kind_of(obj, rb_cRange)) return Qfalse; if (!rb_obj_is_kind_of(obj, rb_cRange)) return Qfalse;
if (!rb_equal(rb_ivar_get(range, id_beg), rb_ivar_get(obj, id_beg))) if (!rb_equal(rb_ivar_get(range, id_beg), rb_ivar_get(obj, id_beg)))

View File

@ -1,4 +1,4 @@
#define RUBY_VERSION "1.7.0" #define RUBY_VERSION "1.7.0"
#define RUBY_RELEASE_DATE "2000-12-26" #define RUBY_RELEASE_DATE "2000-12-29"
#define RUBY_VERSION_CODE 170 #define RUBY_VERSION_CODE 170
#define RUBY_RELEASE_CODE 20001226 #define RUBY_RELEASE_CODE 20001229