Skip to content

Commit

Permalink
* marshal.c (w_float): must distinguish -0.0 from 0.0.
Browse files Browse the repository at this point in the history
* gc.c (gc_mark_all): tweak mark order for little bit better scan.

* gc.c (rb_gc_mark): ditto.

* gc.c (rb_gc): ditto.

* enum.c (sort_by_i): slight performance boost.

* gc.c (gc_mark_rest): should call gc_mark_children(), not gc_mark().

* gc.c (rb_gc_mark): may cause infinite looop.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1861 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
matz committed Nov 27, 2001
1 parent 09a4937 commit 186c8b5
Show file tree
Hide file tree
Showing 9 changed files with 301 additions and 83 deletions.
22 changes: 22 additions & 0 deletions ChangeLog
@@ -1,8 +1,20 @@
Tue Nov 27 02:15:25 2001 Yukihiro Matsumoto <matz@ruby-lang.org>

* marshal.c (w_float): must distinguish -0.0 from 0.0.

Mon Nov 26 20:57:24 2001 Akinori MUSHA <knu@iDaemons.org>

* ext/Setup*, ext/syslog/*: import the "syslog" module from the
rough ruby project.

Mon Nov 26 16:14:42 2001 K.Kosako <kosako@sofnec.co.jp>

* gc.c (gc_mark_all): tweak mark order for little bit better scan.

* gc.c (rb_gc_mark): ditto.

* gc.c (rb_gc): ditto.

Mon Nov 26 16:54:59 2001 Usaku Nakamura <usa@ruby-lang.org>

* win32/win32.c (mypopen): fixed that mypclose() didn't really close
Expand All @@ -11,11 +23,21 @@ Mon Nov 26 16:54:59 2001 Usaku Nakamura <usa@ruby-lang.org>
* win32/win32.c (CreateChild): set STARTF_USESTDHANDLES flag only
when some handles are passed.

Mon Nov 26 16:31:28 2001 Yukihiro Matsumoto <matz@ruby-lang.org>

* enum.c (sort_by_i): slight performance boost.

Sun Nov 25 21:02:18 2001 Usaku Nakamura <usa@ruby-lang.org>

* parse.y (str_extend): change types of second and third arguments
from char to int.

Thu Nov 22 20:15:28 2001 TAMURA Takashi <sheepman@tcn.zaq.ne.jp>

* gc.c (gc_mark_rest): should call gc_mark_children(), not gc_mark().

* gc.c (rb_gc_mark): may cause infinite looop.

Thu Nov 22 00:28:13 2001 Yukihiro Matsumoto <matz@ruby-lang.org>

* parse.y (str_extend): should check nesting parentheses in #{}.
Expand Down
24 changes: 23 additions & 1 deletion array.c
Expand Up @@ -1086,6 +1086,26 @@ rb_ary_sort(ary)
return ary;
}

static VALUE
sort_inplace(ary)
VALUE ary;
{
qsort(RARRAY(ary)->ptr, RARRAY(ary)->len, sizeof(VALUE),sort_2);
return ary;
}

VALUE
rb_ary_sort_inplace(ary)
VALUE ary;
{
rb_ary_modify(ary);
if (RARRAY(ary)->len <= 1) return ary;

FL_SET(ary, ARY_TMPLOCK); /* prohibit modification during sort */
rb_ensure(sort_inplace, ary, sort_unlock, ary);
return ary;
}

static VALUE
rb_ary_collect(ary)
VALUE ary;
Expand Down Expand Up @@ -1493,7 +1513,9 @@ rb_ary_cmp(ary, ary2)
{
long i, len;

ary2 = to_ary(ary2);
if (TYPE(ary2) != T_ARRAY) {
ary2 = to_ary(ary2);
}
len = RARRAY(ary)->len;
if (len > RARRAY(ary2)->len) {
len = RARRAY(ary2)->len;
Expand Down
24 changes: 20 additions & 4 deletions enum.c
Expand Up @@ -208,7 +208,23 @@ sort_by_i(i, memo)
VALUE i;
NODE *memo;
{
VALUE e = rb_ary_new3(3, rb_yield(i), INT2NUM(memo->u3.cnt), i);
VALUE v, e;

v = rb_yield(i);
if (TYPE(v) == T_ARRAY) {
int j, len = RARRAY(v)->len;

e = rb_ary_new2(len+2);
for (j=0; j<len; j++) {
RARRAY(e)->ptr[j] = RARRAY(v)->ptr[j];
}
RARRAY(e)->ptr[j++] = INT2NUM(memo->u3.cnt);
RARRAY(e)->ptr[j] = i;
RARRAY(e)->len = len + 2;
}
else {
e = rb_ary_new3(3, v, INT2NUM(memo->u3.cnt), i);
}
rb_ary_push(memo->u1.value, e);
memo->u3.cnt++;
return Qnil;
Expand All @@ -225,16 +241,16 @@ static VALUE
enum_sort_by(obj)
VALUE obj;
{
VALUE ary = rb_ary_new();
VALUE ary = rb_ary_new2(2000);
NODE *memo = rb_node_newnode(NODE_MEMO, ary, 0, 0);
long i;

rb_iterate(rb_each, obj, sort_by_i, (VALUE)memo);
rb_gc_force_recycle((VALUE)memo);
rb_iterate(rb_ary_sort_bang, ary, sort_by_sort_body, 0);
rb_ary_sort_inplace(ary);
for (i=0; i<RARRAY(ary)->len; i++) {
VALUE e = RARRAY(ary)->ptr[i];
RARRAY(ary)->ptr[i] = rb_ary_entry(e, 2);
RARRAY(ary)->ptr[i] = RARRAY(e)->ptr[2];
}

return ary;
Expand Down
15 changes: 15 additions & 0 deletions eval.c
Expand Up @@ -7614,6 +7614,9 @@ rb_thread_schedule()
copy_fds(&exceptfds, &th->exceptfds, th->fd);
if (max < th->fd) max = th->fd;
need_select = 1;
if (th->wait_for & WAIT_TIME) {
need_select = 2;
}
th->select_value = 0;
}
if (th->wait_for & WAIT_TIME) {
Expand Down Expand Up @@ -7673,6 +7676,18 @@ rb_thread_schedule()
}
END_FOREACH_FROM(curr, th);
}
if (n == 0 && need_select == 2) {
if (now < 0.0) now = timeofday();
FOREACH_THREAD_FROM(curr, th) {
if ((th->wait_for & (WAIT_SELECT|WAIT_TIME)) && th->delay < now) {
th->status = THREAD_RUNNABLE;
th->wait_for = 0;
th->select_value = 0;
found = 1;
}
}
END_FOREACH_FROM(curr, th);
}
if (n > 0) {
now = -1.0;
/* Some descriptors are ready.
Expand Down
2 changes: 1 addition & 1 deletion ext/pty/extconf.rb
Expand Up @@ -3,12 +3,12 @@
if /mswin32|mingw/ !~ RUBY_PLATFORM
have_header("sys/stropts.h")
have_func("setresuid")
$CFLAGS << "-DHAVE_DEV_PTMX" if /cygwin/ === RUBY_PLATFORM
have_header("libutil.h")
have_header("pty.h")
have_library("util", "openpty")
if have_func("openpty") or
have_func("_getpty") or
have_func("ptsname") or
have_func("ioctl")
create_makefile('pty')
end
Expand Down
10 changes: 5 additions & 5 deletions ext/pty/pty.c
Expand Up @@ -349,7 +349,7 @@ getDevice(master,slave)
int i,j;
char MasterName[DEVICELEN];

#ifdef HAVE_DEV_PTMX
#ifdef HAVE_PTSNAME
char *pn;
void (*s)();

Expand All @@ -364,15 +364,15 @@ getDevice(master,slave)
if(unlockpt(i) != -1) {
if((pn = ptsname(i)) != NULL) {
if((j = open(pn, O_RDWR, 0)) != -1) {
#if defined I_PUSH
#if defined I_PUSH && !defined linux
if(ioctl(j, I_PUSH, "ptem") != -1) {
if(ioctl(j, I_PUSH, "ldterm") != -1) {
#endif
*master = i;
*slave = j;
strcpy(SlaveName, pn);
return;
#if defined I_PUSH
#if defined I_PUSH && !defined linux
}
}
#endif
Expand All @@ -385,10 +385,10 @@ getDevice(master,slave)
rb_raise(rb_eRuntimeError, "Cannot get Master/Slave device");
#else
for (p = deviceNo; *p != NULL; p++) {
sprintf(MasterName ,MasterDevice,*p);
sprintf(MasterName,MasterDevice,*p);
if ((i = open(MasterName,O_RDWR,0)) >= 0) {
*master = i;
sprintf(SlaveName ,SlaveDevice,*p);
sprintf(SlaveName,SlaveDevice,*p);
if ((j = open(SlaveName,O_RDWR,0)) >= 0) {
*slave = j;
chown(SlaveName, getuid(), getgid());
Expand Down
53 changes: 23 additions & 30 deletions gc.c
Expand Up @@ -427,26 +427,23 @@ init_mark_stack()

#define MARK_STACK_EMPTY (mark_stack_ptr == mark_stack)

static int mark_all;

static void rb_gc_mark_children(VALUE ptr);

static void
gc_mark_all()
{
RVALUE *p, *pend;
int i;
mark_all = 0;
while(!mark_all){
mark_all = 1;
for (i = 0; i < heaps_used; i++) {
p = heaps[i]; pend = p + heaps_limits[i];
while (p < pend) {
if ((p->as.basic.flags & FL_MARK) &&
(p->as.basic.flags != FL_MARK)) {
rb_gc_mark_children((VALUE)p);
}
p++;

init_mark_stack();
for (i = 0; i < heaps_used; i++) {
p = heaps[i]; pend = p + heaps_limits[i];
while (p < pend) {
if ((p->as.basic.flags & FL_MARK) &&
(p->as.basic.flags != FL_MARK)) {
rb_gc_mark_children((VALUE)p);
}
p++;
}
}
}
Expand All @@ -464,7 +461,7 @@ gc_mark_rest()

while(p != tmp_arry){
p--;
rb_gc_mark(*p);
rb_gc_mark_children(*p);
}
}

Expand Down Expand Up @@ -565,32 +562,28 @@ void
rb_gc_mark(ptr)
VALUE ptr;
{
int ret;
register RVALUE *obj = RANY(ptr);

if (rb_special_const_p(ptr)) return; /* special const not marked */
if (obj->as.basic.flags == 0) return; /* free cell */
if (obj->as.basic.flags & FL_MARK) return; /* already marked */

if (!mark_stack_overflow){
int ret;
CHECK_STACK(ret);
if (ret) {
obj->as.basic.flags |= FL_MARK;

CHECK_STACK(ret);
if (ret) {
if (!mark_stack_overflow) {
if (mark_stack_ptr - mark_stack < MARK_STACK_MAX) {
*mark_stack_ptr = ptr;
mark_stack_ptr++;
return;
}else{
mark_stack_ptr++;
}
else {
mark_stack_overflow = 1;
}
}
}

obj->as.basic.flags |= FL_MARK;

if (mark_stack_overflow){
mark_all &= 0;
return;
}else{
else {
rb_gc_mark_children(ptr);
}
}
Expand Down Expand Up @@ -1175,8 +1168,8 @@ rb_gc()
while (!MARK_STACK_EMPTY){
if (mark_stack_overflow){
gc_mark_all();
break;
}else{
}
else {
gc_mark_rest();
}
}
Expand Down

0 comments on commit 186c8b5

Please sign in to comment.