* ext/pty/pty.c (getDevice): retry once after GC on failure.

[ruby-core:08282]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10607 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2006-07-26 09:15:31 +00:00
Родитель 544789bd79
Коммит 0cd59e5b59
2 изменённых файлов: 32 добавлений и 20 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Wed Jul 26 18:14:19 2006 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/pty/pty.c (getDevice): retry once after GC on failure.
[ruby-core:08282]
Wed Jul 26 17:43:20 2006 Minero Aoki <aamine@loveruby.net>
* ext/strscan/strscan.c (strscan_do_scan):

Просмотреть файл

@ -295,37 +295,34 @@ pty_finalize_syswait(struct pty_info *info)
return Qnil;
}
#ifdef HAVE_OPENPTY
static int
get_device_once(int *master, int *slave, int fail)
{
#if defined HAVE_OPENPTY
/*
* Use openpty(3) of 4.3BSD Reno and later,
* or the same interface function.
*/
static void
getDevice(int *master, int *slave)
{
if (openpty(master, slave, SlaveName,
(struct termios *)0, (struct winsize *)0) == -1) {
if (!fail) return -1;
rb_raise(rb_eRuntimeError, "openpty() failed");
}
}
#else /* HAVE_OPENPTY */
#ifdef HAVE__GETPTY
static void
getDevice(int *master, int *slave)
{
return 0;
#elif defined HAVE__GETPTY
char *name;
if (!(name = _getpty(master, O_RDWR, 0622, 0))) {
if (!fail) return -1;
rb_raise(rb_eRuntimeError, "_getpty() failed");
}
*slave = open(name, O_RDWR);
strcpy(SlaveName, name);
}
return 0;
#else /* HAVE__GETPTY */
static void
getDevice(int *master, int *slave)
{
int i,j;
#ifdef HAVE_PTSNAME
@ -350,7 +347,7 @@ getDevice(int *master, int *slave)
*master = i;
*slave = j;
strcpy(SlaveName, pn);
return;
return 0;
#if defined I_PUSH && !defined linux
}
}
@ -361,7 +358,8 @@ getDevice(int *master, int *slave)
}
close(i);
}
rb_raise(rb_eRuntimeError, "can't get Master/Slave device");
if (!fail) rb_raise(rb_eRuntimeError, "can't get Master/Slave device");
return -1;
#else
char **p;
char MasterName[DEVICELEN];
@ -375,16 +373,25 @@ getDevice(int *master, int *slave)
*slave = j;
chown(SlaveName, getuid(), getgid());
chmod(SlaveName, 0622);
return;
return 0;
}
close(i);
}
}
rb_raise(rb_eRuntimeError, "can't get %s", SlaveName);
if (fail) rb_raise(rb_eRuntimeError, "can't get %s", SlaveName);
return -1;
#endif
#endif
}
#endif /* HAVE__GETPTY */
#endif /* HAVE_OPENPTY */
static void
getDevice(int *master, int *slave)
{
if (get_device_once(master, slave, 0)) {
rb_gc();
get_device_once(master, slave, 1);
}
}
static void
freeDevice()