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:
parent
08ec02b92b
commit
2cafd39ed2
3
array.c
3
array.c
@ -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
13
eval.c
@ -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
|
||||||
|
@ -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
|
||||||
|
1
range.c
1
range.c
@ -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)))
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user