mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-22 19:44:10 +02:00
* iselect.c (scm_internal_select): Added SCM_ASYNC_TICK at the
end. Also let scm_internal_select be a real function also when not using threads.
This commit is contained in:
parent
68933ba3a4
commit
1cbf4dea5b
1 changed files with 41 additions and 40 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
|
/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -45,19 +45,11 @@
|
||||||
|
|
||||||
#include "_scm.h"
|
#include "_scm.h"
|
||||||
|
|
||||||
/*
|
|
||||||
* iselect.c is linked with Guile only when threads are in use. However,
|
|
||||||
* when threads are *not* in use, the `make depend' mechanism will try
|
|
||||||
* to process this file anyway and get tangled up in iselect.h and
|
|
||||||
* coop_threads.h. Therefore, we use the USE_THREADS macro (which is
|
|
||||||
* otherwise redundant for this file) to prevent `make depend' from
|
|
||||||
* failing.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef USE_THREADS
|
|
||||||
#include "iselect.h"
|
#include "iselect.h"
|
||||||
|
|
||||||
|
#ifdef GUILE_ISELECT
|
||||||
|
|
||||||
#include "coop-threads.h"
|
#include "coop-threads.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MISSING_BZERO_DECL
|
#ifdef MISSING_BZERO_DECL
|
||||||
extern void bzero (void *, size_t);
|
extern void bzero (void *, size_t);
|
||||||
|
@ -602,6 +594,36 @@ coop_wait_for_runnable_thread ()
|
||||||
return coop_wait_for_runnable_thread_now (&now);
|
return coop_wait_for_runnable_thread_now (&now);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Initialize bit counting array */
|
||||||
|
static void init_bc (int bit, int i, int n)
|
||||||
|
{
|
||||||
|
if (bit == 0)
|
||||||
|
bc[i] = n;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
init_bc (bit >> 1, i, n);
|
||||||
|
init_bc (bit >> 1, i | bit, n + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
scm_init_iselect ()
|
||||||
|
{
|
||||||
|
#if 0 /* This is just symbolic */
|
||||||
|
collisionp = 0;
|
||||||
|
gnfds = 0;
|
||||||
|
FD_ZERO (&greadfds);
|
||||||
|
FD_ZERO (&gwritefds);
|
||||||
|
FD_ZERO (&gexceptfds);
|
||||||
|
timeout0.tv_sec = 0;
|
||||||
|
timeout0.tv_usec = 0;
|
||||||
|
#endif
|
||||||
|
init_bc (0x80, 0, 0);
|
||||||
|
#include "iselect.x"
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* GUILE_ISELECT */
|
||||||
|
|
||||||
int
|
int
|
||||||
scm_internal_select (int nfds,
|
scm_internal_select (int nfds,
|
||||||
SELECT_TYPE *readfds,
|
SELECT_TYPE *readfds,
|
||||||
|
@ -609,6 +631,11 @@ scm_internal_select (int nfds,
|
||||||
SELECT_TYPE *exceptfds,
|
SELECT_TYPE *exceptfds,
|
||||||
struct timeval *timeout)
|
struct timeval *timeout)
|
||||||
{
|
{
|
||||||
|
#ifndef GUILE_ISELECT
|
||||||
|
int res = select (nfds, readfds, writefds, exceptfds, timeout);
|
||||||
|
SCM_ASYNC_TICK;
|
||||||
|
return res;
|
||||||
|
#else /* GUILE_ISELECT */
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
coop_t *t, *curr = coop_global_curr;
|
coop_t *t, *curr = coop_global_curr;
|
||||||
|
|
||||||
|
@ -661,33 +688,7 @@ scm_internal_select (int nfds,
|
||||||
if (coop_global_curr->retval == -1)
|
if (coop_global_curr->retval == -1)
|
||||||
errno = coop_global_curr->_errno;
|
errno = coop_global_curr->_errno;
|
||||||
SCM_ALLOW_INTS;
|
SCM_ALLOW_INTS;
|
||||||
|
SCM_ASYNC_TICK;
|
||||||
return coop_global_curr->retval;
|
return coop_global_curr->retval;
|
||||||
}
|
#endif /* GUILE_ISELECT */
|
||||||
|
|
||||||
/* Initialize bit counting array */
|
|
||||||
static void init_bc (int bit, int i, int n)
|
|
||||||
{
|
|
||||||
if (bit == 0)
|
|
||||||
bc[i] = n;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
init_bc (bit >> 1, i, n);
|
|
||||||
init_bc (bit >> 1, i | bit, n + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
scm_init_iselect ()
|
|
||||||
{
|
|
||||||
#if 0 /* This is just symbolic */
|
|
||||||
collisionp = 0;
|
|
||||||
gnfds = 0;
|
|
||||||
FD_ZERO (&greadfds);
|
|
||||||
FD_ZERO (&gwritefds);
|
|
||||||
FD_ZERO (&gexceptfds);
|
|
||||||
timeout0.tv_sec = 0;
|
|
||||||
timeout0.tv_usec = 0;
|
|
||||||
#endif
|
|
||||||
init_bc (0x80, 0, 0);
|
|
||||||
#include "iselect.x"
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue