mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* gc.c (mem_error): prohibit recursive mem_error().
(ruby-bugs-ja:PR#36) * eval.c (rb_thread_fd_writable): should not switch context if rb_thread_critical is set. * eval.c (rb_thread_wait_fd): ditto. * eval.c (rb_thread_wait_for): ditto. * eval.c (rb_thread_select): ditto. * eval.c (rb_thread_join): join during critical section causes deadlock. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_6@1087 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
fd850de8a8
commit
32d0e70329
5 changed files with 40 additions and 11 deletions
21
ChangeLog
21
ChangeLog
|
|
@ -1,3 +1,22 @@
|
|||
Fri Dec 29 11:41:55 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* gc.c (mem_error): prohibit recursive mem_error().
|
||||
(ruby-bugs-ja:PR#36)
|
||||
|
||||
Fri Dec 29 11:05:41 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* eval.c (rb_thread_fd_writable): should not switch context if
|
||||
rb_thread_critical is set.
|
||||
|
||||
* eval.c (rb_thread_wait_fd): ditto.
|
||||
|
||||
* eval.c (rb_thread_wait_for): ditto.
|
||||
|
||||
* eval.c (rb_thread_select): ditto.
|
||||
|
||||
* eval.c (rb_thread_join): join during critical section causes
|
||||
deadlock.
|
||||
|
||||
Tue Dec 26 18:46:41 2000 NAKAMURA Hiroshi <nakahiro@sarion.co.jp>
|
||||
|
||||
* lib/debug.rb: Avoid thread deadlock in debugging stopped thread.
|
||||
|
|
@ -116,7 +135,7 @@ Tue Dec 19 13:44:50 2000 K.Kosako <kosako@sofnec.co.jp>
|
|||
|
||||
Tue Dec 19 00:57:10 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* time.c (time_minus): usec might overflow (ruby-bugs-ja:#PR#35).
|
||||
* time.c (time_minus): usec might overflow. (ruby-bugs-ja:PR#35)
|
||||
|
||||
* eval.c (rb_obj_extend): Object#extend should take at least one
|
||||
argument.
|
||||
|
|
|
|||
13
eval.c
13
eval.c
|
|
@ -7349,6 +7349,7 @@ void
|
|||
rb_thread_wait_fd(fd)
|
||||
int fd;
|
||||
{
|
||||
if (rb_thread_critical) return;
|
||||
if (curr_thread == curr_thread->next) return;
|
||||
if (curr_thread->status == THREAD_TO_KILL) return;
|
||||
|
||||
|
|
@ -7362,6 +7363,7 @@ int
|
|||
rb_thread_fd_writable(fd)
|
||||
int fd;
|
||||
{
|
||||
if (rb_thread_critical) return Qtrue;
|
||||
if (curr_thread == curr_thread->next) return Qtrue;
|
||||
if (curr_thread->status == THREAD_TO_KILL) return Qtrue;
|
||||
|
||||
|
|
@ -7382,7 +7384,8 @@ rb_thread_wait_for(time)
|
|||
{
|
||||
double date;
|
||||
|
||||
if (curr_thread == curr_thread->next ||
|
||||
if (rb_thread_critical ||
|
||||
curr_thread == curr_thread->next ||
|
||||
curr_thread->status == THREAD_TO_KILL) {
|
||||
int n;
|
||||
#ifndef linux
|
||||
|
|
@ -7447,7 +7450,8 @@ rb_thread_select(max, read, write, except, timeout)
|
|||
(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) {
|
||||
#ifndef linux
|
||||
struct timeval tv, *tvp = timeout;
|
||||
|
|
@ -7513,6 +7517,7 @@ rb_thread_join(thread)
|
|||
rb_thread_t th = rb_thread_check(thread);
|
||||
enum thread_status last_status = THREAD_RUNNABLE;
|
||||
|
||||
if (rb_thread_critical) rb_thread_deadlock();
|
||||
if (!rb_thread_dead(th)) {
|
||||
if (th == curr_thread)
|
||||
rb_raise(rb_eThreadError, "thread tried to join itself");
|
||||
|
|
@ -7612,8 +7617,8 @@ rb_thread_kill(thread)
|
|||
rb_thread_ready(th);
|
||||
th->gid = 0;
|
||||
th->status = THREAD_TO_KILL;
|
||||
rb_thread_schedule();
|
||||
return Qnil; /* not reached */
|
||||
if (!rb_thread_critical) rb_thread_schedule();
|
||||
return thread;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
|
|
|||
|
|
@ -103,11 +103,9 @@ static int duppair proto((char *, datum));
|
|||
/*
|
||||
* externals
|
||||
*/
|
||||
#ifndef sun
|
||||
#ifndef MSDOS
|
||||
#if !defined(sun) && !defined(MSDOS) && !defined(_WIN32)
|
||||
extern int errno;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* forward
|
||||
|
|
|
|||
9
gc.c
9
gc.c
|
|
@ -53,10 +53,17 @@ static void
|
|||
mem_error(mesg)
|
||||
char *mesg;
|
||||
{
|
||||
static int recurse = 0;
|
||||
|
||||
if (rb_safe_level() >= 4) {
|
||||
rb_raise(rb_eNoMemError, mesg);
|
||||
}
|
||||
rb_fatal(mesg);
|
||||
if (recurse == 0) {
|
||||
recurse++;
|
||||
rb_fatal(mesg);
|
||||
}
|
||||
fprintf(stderr, "[FATAL] failed to allocate memory\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void *
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#define RUBY_VERSION "1.6.2"
|
||||
#define RUBY_RELEASE_DATE "2000-12-25"
|
||||
#define RUBY_RELEASE_DATE "2000-12-29"
|
||||
#define RUBY_VERSION_CODE 162
|
||||
#define RUBY_RELEASE_CODE 20001225
|
||||
#define RUBY_RELEASE_CODE 20001229
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue