Project

General

Profile

Bug #4527 ยป 0001-IO-close-releases-GVL-if-possible.patch

[PATCH] IO#close releases GVL if possible - normalperson (Eric Wong), 03/26/2011 03:35 AM

View differences:

io.c
return finish_writeconv(p->fptr, p->noalloc);
}
static VALUE
nogvl_close(void *ptr)
{
int *fd = (int *)ptr;
return (VALUE)close(*fd);
}
static int
maygvl_close(int fd, int keepgvl)
{
if (keepgvl)
return close(fd);
return (int)rb_thread_blocking_region(nogvl_close, &fd, RUBY_UBF_IO, 0);
}
static void
fptr_finalize(rb_io_t *fptr, int noraise)
{
......
/* fptr->fd may be closed even if close fails.
* POSIX doesn't specify it.
* We assumes it is closed. */
if (close(fptr->fd) < 0 && NIL_P(err))
if (maygvl_close(fptr->fd, noraise) < 0 && NIL_P(err))
err = noraise ? Qtrue : INT2NUM(errno);
}
skip_fd_close:
......
#endif
}
else {
if (close(fptr->fd) < 0)
if (maygvl_close(fptr->fd, 0) < 0)
rb_sys_fail_path(fptr->pathv);
fptr->fd = -1;
fptr->fd = rb_sysopen(fptr->pathv, oflags, 0666);
    (1-1/1)