mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-11 14:21:10 +02:00
* filesys.c (set_element): Return file descriptor.
(fill_select_type): Return the highest file descriptor. (scm_select): Tell select about the highest file descriptor. On some systems the SELECT_SET_SIZE can be as much as 128 bytes. Therefore the extra overhead for calculating the maximum fd seems to be more than compensated. Is this correct? In any case, scm_internal_select will be much faster with this info. (scm_select, fill_select_type, set_element): Don't accept any kind of object in the file descriptor list or vector.
This commit is contained in:
parent
341eaef04b
commit
cafc12ffdd
3 changed files with 59 additions and 20 deletions
|
@ -1,3 +1,25 @@
|
||||||
|
1997-12-08 Mikael Djurfeldt <mdj@mdj.nada.kth.se>
|
||||||
|
|
||||||
|
* filesys.c (set_element): Return file descriptor.
|
||||||
|
(fill_select_type): Return the highest file descriptor.
|
||||||
|
(scm_select): Tell select about the highest file descriptor. On
|
||||||
|
some systems the SELECT_SET_SIZE can be as much as 128 bytes.
|
||||||
|
Therefore the extra overhead for calculating the maximum fd seems
|
||||||
|
to be more than compensated. Is this correct? In any case,
|
||||||
|
scm_internal_select will be much faster with this info.
|
||||||
|
(scm_select, fill_select_type, set_element): Don't accept any kind
|
||||||
|
of object in the file descriptor list or vector.
|
||||||
|
|
||||||
|
1997-12-07 Mikael Djurfeldt <mdj@mdj.nada.kth.se>
|
||||||
|
|
||||||
|
* iselect.c (finalize_fd_sets): Bugfix.
|
||||||
|
|
||||||
|
1997-12-06 Mikael Djurfeldt <mdj@mdj.nada.kth.se>
|
||||||
|
|
||||||
|
* filesys.c (scm_select): Don't use SCM_DEFER_INTS/SCM_ALLOW_INTS
|
||||||
|
when using scm_internal_select (since we might switch to another
|
||||||
|
thread).
|
||||||
|
|
||||||
Sun Dec 7 01:43:56 1997 Gary Houston <ghouston@actrix.gen.nz>
|
Sun Dec 7 01:43:56 1997 Gary Houston <ghouston@actrix.gen.nz>
|
||||||
|
|
||||||
* simpos.c (scm_system): always define: use sysmissing if not
|
* simpos.c (scm_system): always define: use sysmissing if not
|
||||||
|
|
|
@ -820,21 +820,29 @@ scm_getcwd ()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SCM_PROC (s_select, "select", 3, 2, 0, scm_select);
|
||||||
|
|
||||||
static void
|
|
||||||
set_element (SELECT_TYPE *set, SCM element)
|
static int
|
||||||
|
set_element (SELECT_TYPE *set, SCM element, int arg)
|
||||||
{
|
{
|
||||||
|
int fd;
|
||||||
element = SCM_COERCE_OUTPORT (element);
|
element = SCM_COERCE_OUTPORT (element);
|
||||||
if (SCM_NIMP (element) && SCM_TYP16 (element) == scm_tc16_fport
|
if (SCM_NIMP (element) && SCM_TYP16 (element) == scm_tc16_fport
|
||||||
&& SCM_OPPORTP (element))
|
&& SCM_OPPORTP (element))
|
||||||
FD_SET (fileno ((FILE *) SCM_STREAM (element)), set);
|
fd = fileno ((FILE *) SCM_STREAM (element));
|
||||||
else if (SCM_INUMP (element))
|
else {
|
||||||
FD_SET (SCM_INUM (element), set);
|
SCM_ASSERT (SCM_INUMP (element), element, arg, s_select);
|
||||||
|
fd = SCM_INUM (element);
|
||||||
|
}
|
||||||
|
FD_SET (fd, set);
|
||||||
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
fill_select_type (SELECT_TYPE *set, SCM list)
|
fill_select_type (SELECT_TYPE *set, SCM list, int arg)
|
||||||
{
|
{
|
||||||
|
int max_fd = 0, fd;
|
||||||
if (SCM_NIMP (list) && SCM_VECTORP (list))
|
if (SCM_NIMP (list) && SCM_VECTORP (list))
|
||||||
{
|
{
|
||||||
int len = SCM_LENGTH (list);
|
int len = SCM_LENGTH (list);
|
||||||
|
@ -842,7 +850,9 @@ fill_select_type (SELECT_TYPE *set, SCM list)
|
||||||
|
|
||||||
while (len > 0)
|
while (len > 0)
|
||||||
{
|
{
|
||||||
set_element (set, ve[len - 1]);
|
fd = set_element (set, ve[len - 1], arg);
|
||||||
|
if (fd > max_fd)
|
||||||
|
max_fd = fd;
|
||||||
len--;
|
len--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -850,10 +860,14 @@ fill_select_type (SELECT_TYPE *set, SCM list)
|
||||||
{
|
{
|
||||||
while (list != SCM_EOL)
|
while (list != SCM_EOL)
|
||||||
{
|
{
|
||||||
set_element (set, SCM_CAR (list));
|
fd = set_element (set, SCM_CAR (list), arg);
|
||||||
|
if (fd > max_fd)
|
||||||
|
max_fd = fd;
|
||||||
list = SCM_CDR (list);
|
list = SCM_CDR (list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return max_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SCM
|
static SCM
|
||||||
|
@ -905,8 +919,6 @@ retrieve_select_type (SELECT_TYPE *set, SCM list)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SCM_PROC (s_select, "select", 3, 2, 0, scm_select);
|
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
scm_select (reads, writes, excepts, secs, usecs)
|
scm_select (reads, writes, excepts, secs, usecs)
|
||||||
SCM reads;
|
SCM reads;
|
||||||
|
@ -921,6 +933,7 @@ scm_select (reads, writes, excepts, secs, usecs)
|
||||||
SELECT_TYPE read_set;
|
SELECT_TYPE read_set;
|
||||||
SELECT_TYPE write_set;
|
SELECT_TYPE write_set;
|
||||||
SELECT_TYPE except_set;
|
SELECT_TYPE except_set;
|
||||||
|
int max_fd, fd;
|
||||||
int sreturn;
|
int sreturn;
|
||||||
|
|
||||||
#define assert_set(x, arg) \
|
#define assert_set(x, arg) \
|
||||||
|
@ -935,9 +948,13 @@ scm_select (reads, writes, excepts, secs, usecs)
|
||||||
FD_ZERO (&write_set);
|
FD_ZERO (&write_set);
|
||||||
FD_ZERO (&except_set);
|
FD_ZERO (&except_set);
|
||||||
|
|
||||||
fill_select_type (&read_set, reads);
|
max_fd = fill_select_type (&read_set, reads, SCM_ARG1);
|
||||||
fill_select_type (&write_set, writes);
|
fd = fill_select_type (&write_set, writes, SCM_ARG2);
|
||||||
fill_select_type (&except_set, excepts);
|
if (fd > max_fd)
|
||||||
|
max_fd = fd;
|
||||||
|
fd = fill_select_type (&except_set, excepts, SCM_ARG3);
|
||||||
|
if (fd > max_fd)
|
||||||
|
max_fd = fd;
|
||||||
|
|
||||||
if (SCM_UNBNDP (secs) || SCM_FALSEP (secs))
|
if (SCM_UNBNDP (secs) || SCM_FALSEP (secs))
|
||||||
time_p = 0;
|
time_p = 0;
|
||||||
|
@ -969,17 +986,17 @@ scm_select (reads, writes, excepts, secs, usecs)
|
||||||
time_p = &timeout;
|
time_p = &timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM_DEFER_INTS;
|
|
||||||
#ifdef GUILE_ISELECT
|
#ifdef GUILE_ISELECT
|
||||||
sreturn = scm_internal_select (SELECT_SET_SIZE,
|
sreturn = scm_internal_select (max_fd + 1,
|
||||||
&read_set, &write_set, &except_set, time_p);
|
&read_set, &write_set, &except_set, time_p);
|
||||||
#else
|
#else
|
||||||
sreturn = select (SELECT_SET_SIZE,
|
SCM_DEFER_INTS;
|
||||||
|
sreturn = select (max_fd + 1,
|
||||||
&read_set, &write_set, &except_set, time_p);
|
&read_set, &write_set, &except_set, time_p);
|
||||||
|
SCM_ALLOW_INTS;
|
||||||
#endif
|
#endif
|
||||||
if (sreturn < 0)
|
if (sreturn < 0)
|
||||||
scm_syserror (s_select);
|
scm_syserror (s_select);
|
||||||
SCM_ALLOW_INTS;
|
|
||||||
return scm_listify (retrieve_select_type (&read_set, reads),
|
return scm_listify (retrieve_select_type (&read_set, reads),
|
||||||
retrieve_select_type (&write_set, writes),
|
retrieve_select_type (&write_set, writes),
|
||||||
retrieve_select_type (&except_set, excepts),
|
retrieve_select_type (&except_set, excepts),
|
||||||
|
|
|
@ -311,14 +311,14 @@ finalize_fd_sets (coop_t *t)
|
||||||
{
|
{
|
||||||
((ulongptr) t->writefds)[i] &= ((ulongptr) &rwritefds)[i];
|
((ulongptr) t->writefds)[i] &= ((ulongptr) &rwritefds)[i];
|
||||||
((ulongptr) &gwritefds)[i] &= ~s;
|
((ulongptr) &gwritefds)[i] &= ~s;
|
||||||
n_ones += SCM_NLONGBITS (&((ulongptr) t->readfds)[i]);
|
n_ones += SCM_NLONGBITS (&((ulongptr) t->writefds)[i]);
|
||||||
}
|
}
|
||||||
cont_write:
|
cont_write:
|
||||||
if (t->exceptfds != NULL && (s = ((ulongptr) t->exceptfds)[i]) != 0)
|
if (t->exceptfds != NULL && (s = ((ulongptr) t->exceptfds)[i]) != 0)
|
||||||
{
|
{
|
||||||
((ulongptr) t->exceptfds)[i] &= ((ulongptr) &rexceptfds)[i];
|
((ulongptr) t->exceptfds)[i] &= ((ulongptr) &rexceptfds)[i];
|
||||||
((ulongptr) &gexceptfds)[i] &= ~s;
|
((ulongptr) &gexceptfds)[i] &= ~s;
|
||||||
n_ones += SCM_NLONGBITS (&((ulongptr) t->readfds)[i]);
|
n_ones += SCM_NLONGBITS (&((ulongptr) t->exceptfds)[i]);
|
||||||
}
|
}
|
||||||
cont_except:
|
cont_except:
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue