1999-07-30  Andreas Schwab  <schwab@suse.de>

	* sysdeps/unix/sysv/linux/getsysstats.c (GET_NPROCS_PARSER): New
	definition.
	(__get_nprocs): Use it.
	(__get_nprocs_conf): Define as separate function if
	GET_NPROCS_CONF_PARSER is defined.
	* sysdeps/unix/sysv/linux/alpha/getsysstats.c: New file.

	* include/sys/sysinfo.h: New file.
	* sysdeps/generic/sys/sysinfo.h: Remove declaration of internal
	interface.
	* sysdeps/unix/sysv/linux/sys/sysinfo.h: Likewise.

1999-07-30  H.J. Lu  <hjl@gnu.org>

	* libio/iofflush.c (fflush_unlocked): Weak aliase if
	_IO_MTSAFE_IO is not defined.
	* libio/clearerr.c (clearerr_unlocked): Likewise.
	* libio/feof.c (feof_unlocked): Likewise.
	* libio/ferror.c (ferror_unlocked): Likewise.
	* libio/fputc.c (fputc_unlocked): Likewise.
	* libio/getc.c (getc_unlocked, fgetc_unlocked): Likewise.
	* libio/getchar.c (getchar_unlocked): Likewise.
	* libio/putc.c (putc_unlocked): Likewise.
	* libio/putchar.c (putchar_unlocked): Likewise.

1999-07-30  Thorsten Kukuk  <kukuk@suse.de>

	* sunrpc/Versions: Add svc_getreq_common, svc_getreq_poll,
	  svc_max_pollfd and svc_pollfd to GLIBC_2.2
	* sunrpc/rpc/svc.h: Use rpc*_t types, add new prototypes
	  for svc_run/poll interface.
	* sunrpc/rpc/types.h: Add rpc*_t typedefs.
	* sunrpc/rpc_common.c: Add svc_pollfd and svc_max_pollfd as
	  global variable.
	* sunrpc/svc.c: Add svc_getreq_poll and svc_getreq_common,
	  rewrite other svc_getreq* functions to use svc_getreq_common.
	* sunrpc/svc_run.c: Use poll().

1999-07-30  Andreas Schwab  <schwab@suse.de>

	* Makerules: Put sysd-versions and Versions.all on
	postclean-generated instead of common-generated.

1999-07-29  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* manual/time.texi (Basic CPU Time): Note that clock_t can wrap
	around and CLOCKS_PER_SEC is 1e6.
This commit is contained in:
Ulrich Drepper 1999-07-31 06:11:24 +00:00
parent 3d558f4ec7
commit bdb04ee8e2
23 changed files with 538 additions and 372 deletions

View File

@ -1,3 +1,53 @@
1999-07-30 Andreas Schwab <schwab@suse.de>
* sysdeps/unix/sysv/linux/getsysstats.c (GET_NPROCS_PARSER): New
definition.
(__get_nprocs): Use it.
(__get_nprocs_conf): Define as separate function if
GET_NPROCS_CONF_PARSER is defined.
* sysdeps/unix/sysv/linux/alpha/getsysstats.c: New file.
* include/sys/sysinfo.h: New file.
* sysdeps/generic/sys/sysinfo.h: Remove declaration of internal
interface.
* sysdeps/unix/sysv/linux/sys/sysinfo.h: Likewise.
1999-07-30 H.J. Lu <hjl@gnu.org>
* libio/iofflush.c (fflush_unlocked): Weak aliase if
_IO_MTSAFE_IO is not defined.
* libio/clearerr.c (clearerr_unlocked): Likewise.
* libio/feof.c (feof_unlocked): Likewise.
* libio/ferror.c (ferror_unlocked): Likewise.
* libio/fputc.c (fputc_unlocked): Likewise.
* libio/getc.c (getc_unlocked, fgetc_unlocked): Likewise.
* libio/getchar.c (getchar_unlocked): Likewise.
* libio/putc.c (putc_unlocked): Likewise.
* libio/putchar.c (putchar_unlocked): Likewise.
1999-07-30 Thorsten Kukuk <kukuk@suse.de>
* sunrpc/Versions: Add svc_getreq_common, svc_getreq_poll,
svc_max_pollfd and svc_pollfd to GLIBC_2.2
* sunrpc/rpc/svc.h: Use rpc*_t types, add new prototypes
for svc_run/poll interface.
* sunrpc/rpc/types.h: Add rpc*_t typedefs.
* sunrpc/rpc_common.c: Add svc_pollfd and svc_max_pollfd as
global variable.
* sunrpc/svc.c: Add svc_getreq_poll and svc_getreq_common,
rewrite other svc_getreq* functions to use svc_getreq_common.
* sunrpc/svc_run.c: Use poll().
1999-07-30 Andreas Schwab <schwab@suse.de>
* Makerules: Put sysd-versions and Versions.all on
postclean-generated instead of common-generated.
1999-07-29 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* manual/time.texi (Basic CPU Time): Note that clock_t can wrap
around and CLOCKS_PER_SEC is 1e6.
1999-07-30 Ulrich Drepper <drepper@cygnus.com>
* configure.in: Add test for local label subtraction.

View File

@ -269,7 +269,8 @@ ifdef sysd-dirs-done
ifeq ($(versioning),yes)
-include $(common-objpfx)sysd-versions
$(addprefix $(common-objpfx),$(version-maps)): $(common-objpfx)sysd-versions
common-generated += $(version-maps) sysd-versions Versions.all
common-generated += $(version-maps)
postclean-generated += sysd-versions Versions.all
ifndef avoid-generated
ifneq ($(sysd-versions-subdirs),$(all-subdirs) $(config-sysdirs))

18
include/sys/sysinfo.h Normal file
View File

@ -0,0 +1,18 @@
#ifndef _SYS_SYSINFO_H
#include_next <sys/sysinfo.h>
/* Now we define the internal interface. */
/* Return number of configured processors. */
extern int __get_nprocs_conf __P ((void));
/* Return number of available processors. */
extern int __get_nprocs __P ((void));
/* Return number of physical pages of memory in the system. */
extern int __get_phys_pages __P ((void));
/* Return number of available physical pages of memory in the system. */
extern int __get_avphys_pages __P ((void));
#endif /* sys/sysinfo.h */

View File

@ -28,3 +28,7 @@ clearerr (fp)
_IO_clearerr (fp);
_IO_funlockfile (fp);
}
#if defined weak_alias && !defined _IO_MTSAFE_IO
weak_alias (clearerr, clearerr_unlocked)
#endif

View File

@ -40,4 +40,9 @@ _IO_feof (fp)
#ifdef weak_alias
weak_alias (_IO_feof, feof)
#ifndef _IO_MTSAFE_IO
#undef feof_unlocked
weak_alias (_IO_feof, feof_unlocked)
#endif
#endif

View File

@ -40,4 +40,9 @@ _IO_ferror (fp)
#ifdef weak_alias
weak_alias (_IO_ferror, ferror)
#ifndef _IO_MTSAFE_IO
#undef ferror_unlocked
weak_alias (_IO_ferror, ferror_unlocked)
#endif
#endif

View File

@ -40,3 +40,8 @@ fputc (c, fp)
_IO_cleanup_region_end (0);
return result;
}
#if defined weak_alias && !defined _IO_MTSAFE_IO
#undef fputc_unlocked
weak_alias (fputc, fputc_unlocked)
#endif

View File

@ -47,4 +47,10 @@ _IO_getc (fp)
#ifdef weak_alias
weak_alias (_IO_getc, getc)
weak_alias (_IO_getc, fgetc)
#ifndef _IO_MTSAFE_IO
#undef getc_unlocked
weak_alias (_IO_getc, getc_unlocked)
weak_alias (_IO_getc, fgetc_unlocked)
#endif
#endif

View File

@ -40,3 +40,8 @@ getchar ()
_IO_cleanup_region_end (0);
return result;
}
#if defined weak_alias && !defined _IO_MTSAFE_IO
#undef getchar_unlocked
weak_alias (getchar, getchar_unlocked)
#endif

View File

@ -47,4 +47,8 @@ _IO_fflush (fp)
#ifdef weak_alias
weak_alias (_IO_fflush, fflush)
#ifndef _IO_MTSAFE_IO
weak_alias (_IO_fflush, fflush_unlocked)
#endif
#endif

View File

@ -40,4 +40,9 @@ _IO_putc (c, fp)
#ifdef weak_alias
weak_alias (_IO_putc, putc)
#ifndef _IO_MTSAFE_IO
#undef putc_unlocked
weak_alias (_IO_putc, putc_unlocked)
#endif
#endif

View File

@ -34,3 +34,8 @@ putchar (c)
_IO_cleanup_region_end (0);
return result;
}
#if defined weak_alias && !defined _IO_MTSAFE_IO
#undef putchar_unlocked
weak_alias (putchar, putchar_unlocked)
#endif

View File

@ -95,11 +95,16 @@ to @code{double}, as in the example above, makes sure that operations
such as arithmetic and printing work properly and consistently no matter
what the underlying representation is.
Note that the clock can wrap around. On a 32bit system with
@code{CLOCKS_PER_SEC} set to one million a wrap around happens after
around 36 minutes.
@comment time.h
@comment ISO
@deftypevr Macro int CLOCKS_PER_SEC
The value of this macro is the number of clock ticks per second measured
by the @code{clock} function.
by the @code{clock} function. POSIX requires that this value is one
million independend of the actual resolution.
@end deftypevr
@comment time.h

View File

@ -107,4 +107,6 @@ libc {
xdr_hyper; xdr_u_hyper; xdr_longlong_t; xdr_u_longlong_t;
xdr_int64_t; xdr_uint64_t;
}
GLIBC_2.2 {
svc_getreq_common; svc_getreq_poll; svc_max_pollfd; svc_pollfd;
}

View File

@ -1,4 +1,3 @@
/* @(#)svc.h 2.2 88/07/29 4.0 RPCSRC; from 1.20 88/02/08 SMI */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
@ -147,12 +146,12 @@ struct SVCXPRT {
* Service request
*/
struct svc_req {
u_long rq_prog; /* service program number */
u_long rq_vers; /* service protocol version */
u_long rq_proc; /* the desired procedure */
struct opaque_auth rq_cred; /* raw creds from the wire */
caddr_t rq_clntcred; /* read only cooked cred */
SVCXPRT *rq_xprt; /* associated transport */
rpcprog_t rq_prog; /* service program number */
rpcvers_t rq_vers; /* service protocol version */
rpcproc_t rq_proc; /* the desired procedure */
struct opaque_auth rq_cred; /* raw creds from the wire */
caddr_t rq_clntcred; /* read only cooked cred */
SVCXPRT *rq_xprt; /* associated transport */
};
#ifndef __DISPATCH_FN_T
@ -165,23 +164,23 @@ typedef void (*__dispatch_fn_t) __PMT ((struct svc_req*, SVCXPRT*));
*
* svc_register(xprt, prog, vers, dispatch, protocol)
* SVCXPRT *xprt;
* u_long prog;
* u_long vers;
* rpcprog_t prog;
* rpcvers_t vers;
* void (*dispatch)();
* u_long protocol; like TCP or UDP, zero means do not register
* rpcprot_t protocol; like TCP or UDP, zero means do not register
*/
extern bool_t svc_register __P ((SVCXPRT *__xprt, u_long __prog,
u_long __vers, __dispatch_fn_t __dispatch,
u_long __protocol));
extern bool_t svc_register __P ((SVCXPRT *__xprt, rpcprog_t __prog,
rpcvers_t __vers, __dispatch_fn_t __dispatch,
rpcprot_t __protocol));
/*
* Service un-registration
*
* svc_unregister(prog, vers)
* u_long prog;
* u_long vers;
* rpcprog_t prog;
* rpcvers_t vers;
*/
extern void svc_unregister __P ((u_long __prog, u_long __vers));
extern void svc_unregister __P ((rpcprog_t __prog, rpcvers_t __vers));
/*
* Transport registration.
@ -189,7 +188,7 @@ extern void svc_unregister __P ((u_long __prog, u_long __vers));
* xprt_register(xprt)
* SVCXPRT *xprt;
*/
extern void xprt_register __P ((SVCXPRT *__xprt));
extern void xprt_register __P ((SVCXPRT *__xprt));
/*
* Transport un-register
@ -197,9 +196,7 @@ extern void xprt_register __P ((SVCXPRT *__xprt));
* xprt_unregister(xprt)
* SVCXPRT *xprt;
*/
extern void xprt_unregister __P ((SVCXPRT *__xprt));
extern void xprt_unregister __P ((SVCXPRT *__xprt));
/*
@ -237,8 +234,8 @@ extern void svcerr_weakauth __P ((SVCXPRT *__xprt));
extern void svcerr_noproc __P ((SVCXPRT *__xprt));
extern void svcerr_progvers __P ((SVCXPRT *__xprt, u_long __low_vers,
u_long __high_vers));
extern void svcerr_progvers __P ((SVCXPRT *__xprt, rpcvers_t __low_vers,
rpcvers_t __high_vers));
extern void svcerr_auth __P ((SVCXPRT *__xprt, enum auth_stat __why));
@ -261,19 +258,20 @@ extern void svcerr_systemerr __P ((SVCXPRT *__xprt));
* Global keeper of rpc service descriptors in use
* dynamic; must be inspected before each call to select
*/
#ifdef FD_SETSIZE
extern struct pollfd *svc_pollfd;
extern int svc_max_pollfd;
extern fd_set svc_fdset;
#define svc_fds svc_fdset.fds_bits[0] /* compatibility */
#else
extern int svc_fds;
#endif /* def FD_SETSIZE */
/*
* a small program implemented by the svc_rpc implementation itself;
* also see clnt.h for protocol numbers.
*/
extern void svc_getreq __P ((int __rdfds));
extern void svc_getreq_common __P ((const int __fd));
extern void svc_getreqset __P ((fd_set *__readfds));
extern void svc_getreq_poll __P ((struct pollfd *, const int));
extern void svc_exit __P ((void));
extern void svc_run __P ((void));

View File

@ -1,4 +1,3 @@
/* @(#)types.h 2.3 88/08/15 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
@ -27,8 +26,6 @@
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
/* @(#)types.h 1.18 87/07/24 SMI */
/* fixincludes should not add extern "C" to this file */
/*
* Rpc additions to <sys/types.h>
@ -38,6 +35,12 @@
typedef int bool_t;
typedef int enum_t;
/* This needs to be changed to uint32_t in the future */
typedef unsigned long rpcprog_t;
typedef unsigned long rpcvers_t;
typedef unsigned long rpcproc_t;
typedef unsigned long rpcprot_t;
typedef unsigned long rpcport_t;
#define __dontcare__ -1

View File

@ -1,4 +1,3 @@
/* @(#)rpc_commondata.c 2.1 88/07/29 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
@ -6,23 +5,23 @@
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
* program developed by the user.
*
*
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
*
*
* Sun RPC is provided with no support and without any obligation on the
* part of Sun Microsystems, Inc. to assist in its use, correction,
* modification or enhancement.
*
*
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
* OR ANY PART THEREOF.
*
*
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
*
*
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
@ -30,12 +29,10 @@
#include <rpc/rpc.h>
/*
* This file should only contain common data (global data) that is exported
* by public interfaces
* by public interfaces
*/
struct opaque_auth _null_auth;
#ifdef FD_SETSIZE
fd_set svc_fdset;
#else
int svc_fds;
#endif /* def FD_SETSIZE */
struct rpc_createerr rpc_createerr;
struct pollfd *svc_pollfd;
int svc_max_pollfd;

View File

@ -1,4 +1,3 @@
/* @(#)svc.c 2.4 88/08/11 4.0 RPCSRC; from 1.44 88/02/08 SMI */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
@ -27,10 +26,6 @@
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
#if !defined(lint) && defined(SCCSIDS)
static char sccsid[] = "@(#)svc.c 1.41 87/10/13 Copyr 1984 Sun Micro";
#endif
/*
* svc.c, Server-side remote procedure call interface.
*
@ -42,170 +37,99 @@ static char sccsid[] = "@(#)svc.c 1.41 87/10/13 Copyr 1984 Sun Micro";
*/
#include <errno.h>
#include <unistd.h>
#include <rpc/rpc.h>
#include <rpc/svc.h>
#include <rpc/pmap_clnt.h>
#include <sys/poll.h>
#ifndef errno
extern int errno;
#endif
#ifdef FD_SETSIZE
static SVCXPRT **xports;
#else
#define NOFILE 32
static SVCXPRT *xports[NOFILE];
#endif /* def FD_SETSIZE */
#define NULL_SVC ((struct svc_callout *)0)
#define RQCRED_SIZE 400 /* this size is excessive */
/*
* The services list
* Each entry represents a set of procedures (an rpc program).
* The dispatch routine takes request structs and runs the
* appropriate procedure.
*/
static struct svc_callout
{
struct svc_callout *sc_next;
u_long sc_prog;
u_long sc_vers;
void (*sc_dispatch) (struct svc_req *, SVCXPRT *);
}
*svc_head;
static struct svc_callout *svc_find (u_long, u_long, struct svc_callout **);
/* The services list
Each entry represents a set of procedures (an rpc program).
The dispatch routine takes request structs and runs the
appropriate procedure. */
static struct svc_callout {
struct svc_callout *sc_next;
rpcprog_t sc_prog;
rpcvers_t sc_vers;
void (*sc_dispatch) (struct svc_req *, SVCXPRT *);
} *svc_head;
/* *************** SVCXPRT related stuff **************** */
/*
* Activate a transport handle.
*/
/* Activate a transport handle. */
void
xprt_register (SVCXPRT *xprt)
{
register int sock = xprt->xp_sock;
register int i;
#ifdef FD_SETSIZE
if (xports == NULL)
{
xports = (SVCXPRT **)
mem_alloc (FD_SETSIZE * sizeof (SVCXPRT *));
xports = (SVCXPRT **) malloc (_rpc_dtablesize () * sizeof (SVCXPRT *));
if (xports == NULL) /* Don´t add handle */
return;
}
if (sock < _rpc_dtablesize ())
{
xports[sock] = xprt;
FD_SET (sock, &svc_fdset);
}
#else
if (sock < NOFILE)
{
xports[sock] = xprt;
svc_fds |= (1 << sock);
}
#endif /* def FD_SETSIZE */
if (sock < FD_SETSIZE)
FD_SET (sock, &svc_fdset);
/* Check if we have an empty slot */
for (i = 0; i < svc_max_pollfd; ++i)
if (svc_pollfd[i].fd == -1)
{
svc_pollfd[i].fd = sock;
svc_pollfd[i].events = (POLLIN | POLLPRI |
POLLRDNORM | POLLRDBAND);
return;
}
++svc_max_pollfd;
svc_pollfd = realloc (svc_pollfd,
sizeof (struct pollfd) * svc_max_pollfd);
if (svc_pollfd == NULL) /* Out of memory */
return;
svc_pollfd[svc_max_pollfd - 1].fd = sock;
svc_pollfd[svc_max_pollfd - 1].events = (POLLIN | POLLPRI |
POLLRDNORM | POLLRDBAND);
}
}
/*
* De-activate a transport handle.
*/
/* De-activate a transport handle. */
void
xprt_unregister (xprt)
SVCXPRT *xprt;
xprt_unregister (SVCXPRT *xprt)
{
register int sock = xprt->xp_sock;
register int i;
#ifdef FD_SETSIZE
if ((sock < _rpc_dtablesize ()) && (xports[sock] == xprt))
{
xports[sock] = (SVCXPRT *) 0;
FD_CLR (sock, &svc_fdset);
if (sock < FD_SETSIZE)
FD_CLR (sock, &svc_fdset);
for (i = 0; i < svc_max_pollfd; ++i)
if (svc_pollfd[i].fd == sock)
svc_pollfd[i].fd = -1;
}
#else
if ((sock < NOFILE) && (xports[sock] == xprt))
{
xports[sock] = (SVCXPRT *) 0;
svc_fds &= ~(1 << sock);
}
#endif /* def FD_SETSIZE */
}
/* ********************** CALLOUT list related stuff ************* */
/*
* Add a service program to the callout list.
* The dispatch routine will be called when a rpc request for this
* program number comes in.
*/
bool_t
svc_register (SVCXPRT *xprt, u_long prog, u_long vers,
void (*dispatch) (struct svc_req *, SVCXPRT *), u_long protocol)
{
struct svc_callout *prev;
register struct svc_callout *s;
if ((s = svc_find (prog, vers, &prev)) != NULL_SVC)
{
if (s->sc_dispatch == dispatch)
goto pmap_it; /* he is registering another xptr */
return FALSE;
}
s = (struct svc_callout *) mem_alloc (sizeof (struct svc_callout));
if (s == (struct svc_callout *) 0)
{
return FALSE;
}
s->sc_prog = prog;
s->sc_vers = vers;
s->sc_dispatch = dispatch;
s->sc_next = svc_head;
svc_head = s;
pmap_it:
/* now register the information with the local binder service */
if (protocol)
{
return pmap_set (prog, vers, protocol, xprt->xp_port);
}
return TRUE;
}
/*
* Remove a service program from the callout list.
*/
void
svc_unregister (prog, vers)
u_long prog;
u_long vers;
{
struct svc_callout *prev;
register struct svc_callout *s;
if ((s = svc_find (prog, vers, &prev)) == NULL_SVC)
return;
if (prev == NULL_SVC)
{
svc_head = s->sc_next;
}
else
{
prev->sc_next = s->sc_next;
}
s->sc_next = NULL_SVC;
mem_free ((char *) s, (u_int) sizeof (struct svc_callout));
/* now unregister the information with the local binder service */
(void) pmap_unset (prog, vers);
}
/*
* Search the callout list for a program number, return the callout
* struct.
*/
/* Search the callout list for a program number, return the callout
struct. */
static struct svc_callout *
svc_find (u_long prog, u_long vers, struct svc_callout **prev)
svc_find (rpcprog_t prog, rpcvers_t vers, struct svc_callout **prev)
{
register struct svc_callout *s, *p;
@ -221,16 +145,68 @@ done:
return s;
}
/* Add a service program to the callout list.
The dispatch routine will be called when a rpc request for this
program number comes in. */
bool_t
svc_register (SVCXPRT * xprt, rpcprog_t prog, rpcvers_t vers,
void (*dispatch) (struct svc_req *, SVCXPRT *),
rpcproc_t protocol)
{
struct svc_callout *prev;
register struct svc_callout *s;
if ((s = svc_find (prog, vers, &prev)) != NULL_SVC)
{
if (s->sc_dispatch == dispatch)
goto pmap_it; /* he is registering another xptr */
return FALSE;
}
s = (struct svc_callout *) mem_alloc (sizeof (struct svc_callout));
if (s == (struct svc_callout *) 0)
return FALSE;
s->sc_prog = prog;
s->sc_vers = vers;
s->sc_dispatch = dispatch;
s->sc_next = svc_head;
svc_head = s;
pmap_it:
/* now register the information with the local binder service */
if (protocol)
return pmap_set (prog, vers, protocol, xprt->xp_port);
return TRUE;
}
/* Remove a service program from the callout list. */
void
svc_unregister (rpcprog_t prog, rpcvers_t vers)
{
struct svc_callout *prev;
register struct svc_callout *s;
if ((s = svc_find (prog, vers, &prev)) == NULL_SVC)
return;
if (prev == NULL_SVC)
svc_head = s->sc_next;
else
prev->sc_next = s->sc_next;
s->sc_next = NULL_SVC;
mem_free ((char *) s, (u_int) sizeof (struct svc_callout));
/* now unregister the information with the local binder service */
pmap_unset (prog, vers);
}
/* ******************* REPLY GENERATION ROUTINES ************ */
/*
* Send a reply to an rpc request
*/
/* Send a reply to an rpc request */
bool_t
svc_sendreply (xprt, xdr_results, xdr_location)
register SVCXPRT *xprt;
xdrproc_t xdr_results;
caddr_t xdr_location;
svc_sendreply (register SVCXPRT *xprt, xdrproc_t xdr_results,
caddr_t xdr_location)
{
struct rpc_msg rply;
@ -243,12 +219,9 @@ svc_sendreply (xprt, xdr_results, xdr_location)
return SVC_REPLY (xprt, &rply);
}
/*
* No procedure error reply
*/
/* No procedure error reply */
void
svcerr_noproc (xprt)
register SVCXPRT *xprt;
svcerr_noproc (register SVCXPRT *xprt)
{
struct rpc_msg rply;
@ -259,12 +232,9 @@ svcerr_noproc (xprt)
SVC_REPLY (xprt, &rply);
}
/*
* Can't decode args error reply
*/
/* Can't decode args error reply */
void
svcerr_decode (xprt)
register SVCXPRT *xprt;
svcerr_decode (register SVCXPRT *xprt)
{
struct rpc_msg rply;
@ -275,12 +245,9 @@ svcerr_decode (xprt)
SVC_REPLY (xprt, &rply);
}
/*
* Some system error
*/
/* Some system error */
void
svcerr_systemerr (xprt)
register SVCXPRT *xprt;
svcerr_systemerr (register SVCXPRT *xprt)
{
struct rpc_msg rply;
@ -291,13 +258,9 @@ svcerr_systemerr (xprt)
SVC_REPLY (xprt, &rply);
}
/*
* Authentication error reply
*/
/* Authentication error reply */
void
svcerr_auth (xprt, why)
SVCXPRT *xprt;
enum auth_stat why;
svcerr_auth (SVCXPRT *xprt, enum auth_stat why)
{
struct rpc_msg rply;
@ -308,23 +271,16 @@ svcerr_auth (xprt, why)
SVC_REPLY (xprt, &rply);
}
/*
* Auth too weak error reply
*/
/* Auth too weak error reply */
void
svcerr_weakauth (xprt)
SVCXPRT *xprt;
svcerr_weakauth (SVCXPRT *xprt)
{
svcerr_auth (xprt, AUTH_TOOWEAK);
}
/*
* Program unavailable error reply
*/
/* Program unavailable error reply */
void
svcerr_noprog (xprt)
register SVCXPRT *xprt;
svcerr_noprog (register SVCXPRT *xprt)
{
struct rpc_msg rply;
@ -335,14 +291,10 @@ svcerr_noprog (xprt)
SVC_REPLY (xprt, &rply);
}
/*
* Program version mismatch error reply
*/
/* Program version mismatch error reply */
void
svcerr_progvers (xprt, low_vers, high_vers)
register SVCXPRT *xprt;
u_long low_vers;
u_long high_vers;
svcerr_progvers (register SVCXPRT *xprt, rpcvers_t low_vers,
rpcvers_t high_vers)
{
struct rpc_msg rply;
@ -376,127 +328,139 @@ svcerr_progvers (xprt, low_vers, high_vers)
void
svc_getreq (int rdfds)
{
#ifdef FD_SETSIZE
fd_set readfds;
FD_ZERO (&readfds);
readfds.fds_bits[0] = rdfds;
svc_getreqset (&readfds);
#else
int readfds = rdfds & svc_fds;
svc_getreqset (&readfds);
#endif /* def FD_SETSIZE */
}
void
svc_getreqset (readfds)
#ifdef FD_SETSIZE
fd_set *readfds;
svc_getreqset (fd_set *readfds)
{
#else
int *readfds;
{
int readfds_local = *readfds;
#endif /* def FD_SETSIZE */
enum xprt_stat stat;
struct rpc_msg msg;
int prog_found;
u_long low_vers;
u_long high_vers;
struct svc_req r;
register SVCXPRT *xprt;
register u_long mask;
register int bit;
register u_int32_t mask;
register u_int32_t *maskp;
register int setsize;
register int sock;
char cred_area[2 * MAX_AUTH_BYTES + RQCRED_SIZE];
msg.rm_call.cb_cred.oa_base = cred_area;
msg.rm_call.cb_verf.oa_base = &(cred_area[MAX_AUTH_BYTES]);
r.rq_clntcred = &(cred_area[2 * MAX_AUTH_BYTES]);
register int bit;
#ifdef FD_SETSIZE
setsize = _rpc_dtablesize ();
maskp = (u_int32_t *) readfds->fds_bits;
for (sock = 0; sock < setsize; sock += 32)
for (mask = *maskp++; (bit = ffs (mask)); mask ^= (1 << (bit - 1)))
svc_getreq_common (sock + bit - 1);
}
void
svc_getreq_poll (struct pollfd *pfdp, int pollretval)
{
register int i;
register int fds_found;
for (i = fds_found = 0; i < svc_max_pollfd && fds_found < pollretval; ++i)
{
for (mask = *maskp++; (bit = ffs (mask)); mask ^= (1 << (bit - 1)))
register struct pollfd *p = &pfdp[i];
if (p->fd != -1 && p->revents)
{
/* sock has input waiting */
xprt = xports[sock + bit - 1];
#else
for (sock = 0; readfds_local != 0; sock++, readfds_local >>= 1)
{
if ((readfds_local & 1) != 0)
{
/* sock has input waiting */
xprt = xports[sock];
#endif /* def FD_SETSIZE */
if (xprt == NULL)
/* But do we control sock? */
continue;
/* fd has input waiting */
++fds_found;
/* now receive msgs from xprtprt (support batch calls) */
do
{
if (SVC_RECV (xprt, &msg))
{
/* now find the exported program and call it */
register struct svc_callout *s;
enum auth_stat why;
r.rq_xprt = xprt;
r.rq_prog = msg.rm_call.cb_prog;
r.rq_vers = msg.rm_call.cb_vers;
r.rq_proc = msg.rm_call.cb_proc;
r.rq_cred = msg.rm_call.cb_cred;
/* first authenticate the message */
if ((why = _authenticate (&r, &msg)) != AUTH_OK)
{
svcerr_auth (xprt, why);
goto call_done;
}
/* now match message with a registered service */
prog_found = FALSE;
low_vers = 0 - 1;
high_vers = 0;
for (s = svc_head; s != NULL_SVC; s = s->sc_next)
{
if (s->sc_prog == r.rq_prog)
{
if (s->sc_vers == r.rq_vers)
{
(*s->sc_dispatch) (&r, xprt);
goto call_done;
} /* found correct version */
prog_found = TRUE;
if (s->sc_vers < low_vers)
low_vers = s->sc_vers;
if (s->sc_vers > high_vers)
high_vers = s->sc_vers;
} /* found correct program */
}
/*
* if we got here, the program or version
* is not served ...
*/
if (prog_found)
svcerr_progvers (xprt, low_vers, high_vers);
else
svcerr_noprog (xprt);
/* Fall through to ... */
}
call_done:
if ((stat = SVC_STAT (xprt)) == XPRT_DIED)
{
SVC_DESTROY (xprt);
break;
}
}
while (stat == XPRT_MOREREQS);
if (p->revents & POLLNVAL)
xprt_unregister (p->fd);
else
svc_getreq_common (p->fd);
}
}
}
void
svc_getreq_common (const int fd)
{
enum xprt_stat stat;
struct rpc_msg msg;
register SVCXPRT *xprt;
char cred_area[2 * MAX_AUTH_BYTES + RQCRED_SIZE];
msg.rm_call.cb_cred.oa_base = cred_area;
msg.rm_call.cb_verf.oa_base = &(cred_area[MAX_AUTH_BYTES]);
xprt = xports[fd];
/* Do we control fd? */
if (xprt == NULL)
return;
/* now receive msgs from xprtprt (support batch calls) */
do
{
if (SVC_RECV (xprt, &msg))
{
/* now find the exported program and call it */
struct svc_callout *s;
struct svc_req r;
enum auth_stat why;
rpcvers_t low_vers;
rpcvers_t high_vers;
int prog_found;
r.rq_clntcred = &(cred_area[2 * MAX_AUTH_BYTES]);
r.rq_xprt = xprt;
r.rq_prog = msg.rm_call.cb_prog;
r.rq_vers = msg.rm_call.cb_vers;
r.rq_proc = msg.rm_call.cb_proc;
r.rq_cred = msg.rm_call.cb_cred;
/* first authenticate the message */
/* Check for null flavor and bypass these calls if possible */
if (msg.rm_call.cb_cred.oa_flavor == AUTH_NULL)
{
r.rq_xprt->xp_verf.oa_flavor = _null_auth.oa_flavor;
r.rq_xprt->xp_verf.oa_length = 0;
}
else if ((why = _authenticate (&r, &msg)) != AUTH_OK)
{
svcerr_auth (xprt, why);
goto call_done;
}
/* now match message with a registered service */
prog_found = FALSE;
low_vers = 0 - 1;
high_vers = 0;
for (s = svc_head; s != NULL_SVC; s = s->sc_next)
{
if (s->sc_prog == r.rq_prog)
{
if (s->sc_vers == r.rq_vers)
{
(*s->sc_dispatch) (&r, xprt);
goto call_done;
}
/* found correct version */
prog_found = TRUE;
if (s->sc_vers < low_vers)
low_vers = s->sc_vers;
if (s->sc_vers > high_vers)
high_vers = s->sc_vers;
}
/* found correct program */
}
/* if we got here, the program or version
is not served ... */
if (prog_found)
svcerr_progvers (xprt, low_vers, high_vers);
else
svcerr_noprog (xprt);
/* Fall through to ... */
}
call_done:
if ((stat = SVC_STAT (xprt)) == XPRT_DIED)
{
SVC_DESTROY (xprt);
break;
}
}
while (stat == XPRT_MOREREQS);
}

View File

@ -1,8 +1,3 @@
/* @(#)svc_run.c 2.1 88/07/29 4.0 RPCSRC */
#if !defined(lint) && defined(SCCSIDS)
static char sccsid[] = "@(#)svc_run.c 1.1 87/10/13 Copyr 1984 Sun Micro";
#endif
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
@ -31,60 +26,58 @@ static char sccsid[] = "@(#)svc_run.c 1.1 87/10/13 Copyr 1984 Sun Micro";
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
/*
* This is the rpc server side idle loop
* Wait for input, call server program.
*/
#include <errno.h>
#include <libintl.h>
#include <rpc/rpc.h>
static int svc_stop;
#include <errno.h>
#include <unistd.h>
#include <libintl.h>
#include <sys/poll.h>
#include <rpc/rpc.h>
/* This function can be used as a signal handler to terminate the
server loop. */
void
svc_exit (void)
{
svc_stop = 1;
free (svc_pollfd);
svc_pollfd = NULL;
svc_max_pollfd = 0;
}
void
svc_run (void)
{
#ifdef FD_SETSIZE
fd_set readfds;
#else
int readfds;
#endif /* def FD_SETSIZE */
svc_stop = 0;
int i;
for (;;)
{
if (svc_stop)
struct pollfd *my_pollfd;
if (svc_max_pollfd == 0 && svc_pollfd == NULL)
return;
#ifdef FD_SETSIZE
readfds = svc_fdset;
#else
readfds = svc_fds;
#endif /* def FD_SETSIZE */
switch (__select (_rpc_dtablesize (), &readfds, (fd_set *)NULL,
(fd_set *)NULL, (struct timeval *) 0))
my_pollfd = malloc (sizeof (struct pollfd) * svc_max_pollfd);
for (i = 0; i < svc_max_pollfd; ++i)
{
my_pollfd[i].fd = svc_pollfd[i].fd;
my_pollfd[i].events = svc_pollfd[i].events;
my_pollfd[i].revents = 0;
}
switch (i = __poll (my_pollfd, svc_max_pollfd, -1))
{
case -1:
if (errno == EINTR)
{
continue;
}
perror (_("svc_run: - select failed"));
continue;
perror (_("svc_run: - poll failed"));
return;
case 0:
continue;
default:
svc_getreqset (&readfds);
svc_getreq_poll (my_pollfd, i);
}
}
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
/* Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -22,20 +22,16 @@
#include <features.h>
/* Return number of configured processors. */
extern int __get_nprocs_conf __P ((void));
extern int get_nprocs_conf __P ((void));
/* Return number of available processors. */
extern int __get_nprocs __P ((void));
extern int get_nprocs __P ((void));
/* Return number of physical pages of memory in the system. */
extern int __get_phys_pages __P ((void));
extern int get_phys_pages __P ((void));
/* Return number of available physical pages of memory in the system. */
extern int __get_avphys_pages __P ((void));
extern int get_avphys_pages __P ((void));
#endif /* sys/sysinfo.h */

View File

@ -0,0 +1,54 @@
/* Determine various system internal values, Linux/Alpha version.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Schwab <schwab@suse.de>
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* We need to define a special parser for /proc/cpuinfo. */
#define GET_NPROCS_PARSER(FP, BUFFER, RESULT) \
do \
{ \
(RESULT) = 0; \
/* Find the line that contains the information about the number of \
active cpus. We don't have to fear extremely long lines since \
the kernel will not generate them. 8192 bytes are really \
enough. */ \
while (fgets_unlocked (BUFFER, sizeof (BUFFER), FP) != NULL) \
if (sscanf (BUFFER, "CPUs probed %*d active %d", &(RESULT)) == 1) \
break; \
} \
while (0)
/* On the Alpha we can distinguish between the number of configured and
active cpus. */
#define GET_NPROCS_CONF_PARSER(FP, BUFFER, RESULT) \
do \
{ \
(RESULT) = 0; \
/* Find the line that contains the information about the number of \
probed cpus. We don't have to fear extremely long lines since \
the kernel will not generate them. 8192 bytes are really \
enough. */ \
while (fgets_unlocked ((BUFFER), sizeof (BUFFER), (FP)) != NULL) \
if (sscanf (buffer, "CPUs probed %d", &(RESULT)) == 1) \
break; \
} \
while (0)
#include <sysdeps/unix/sysv/linux/getsysstats.c>

View File

@ -1,5 +1,5 @@
/* Determine various system internal values, Linux version.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@ -67,6 +67,25 @@ get_proc_path (char *buffer, size_t bufsize)
But not all systems have support for the /proc filesystem. If it
is not available we simply return 1 since there is no way. */
/* Other architectures use different formats for /proc/cpuinfo. This
provides a hook for alternative parsers. */
#ifndef GET_NPROCS_PARSER
# define GET_NPROCS_PARSER(FP, BUFFER, RESULT) \
do \
{ \
(RESULT) = 0; \
/* Read all lines and count the lines starting with the string \
"processor". We don't have to fear extremely long lines since \
the kernel will not generate them. 8192 bytes are really \
enough. */ \
while (fgets_unlocked (BUFFER, sizeof (BUFFER), FP) != NULL) \
if (strncmp (BUFFER, "processor", 9) == 0) \
++(RESULT); \
} \
while (0)
#endif
int
__get_nprocs ()
{
@ -89,15 +108,7 @@ __get_nprocs ()
fp = fopen (proc_cpuinfo, "r");
if (fp != NULL)
{
result = 0;
/* Read all lines and count the lines starting with the
string "processor". We don't have to fear extremely long
lines since the kernel will not generate them. 8192
bytes are really enough. */
while (fgets_unlocked (buffer, sizeof buffer, fp) != NULL)
if (strncmp (buffer, "processor", 9) == 0)
++result;
GET_NPROCS_PARSER (fp, buffer, result);
fclose (fp);
}
}
@ -106,12 +117,46 @@ __get_nprocs ()
}
weak_alias (__get_nprocs, get_nprocs)
#ifdef GET_NPROCS_CONF_PARSER
/* On some architectures it is possible to distinguish between configured
and active cpus. */
int
__get_nprocs_conf ()
{
FILE *fp;
char buffer[8192];
char *proc_path;
int result = 1;
/* XXX Here will come a test for the new system call. */
/* Get mount point of proc filesystem. */
proc_path = get_proc_path (buffer, sizeof buffer);
/* If we haven't found an appropriate entry return 1. */
if (proc_path != NULL)
{
char *proc_cpuinfo = alloca (strlen (proc_path) + sizeof ("/cpuinfo"));
__stpcpy (__stpcpy (proc_cpuinfo, proc_path), "/cpuinfo");
fp = fopen (proc_cpuinfo, "r");
if (fp != NULL)
{
GET_NPROCS_CONF_PARSER (fp, buffer, result);
fclose (fp);
}
}
return result;
}
#else
/* As far as I know Linux has no separate numbers for configured and
available processors. So make the `get_nprocs_conf' function an
alias. */
strong_alias (__get_nprocs, __get_nprocs_conf)
weak_alias (__get_nprocs, get_nprocs_conf)
#endif
weak_alias (__get_nprocs_conf, get_nprocs_conf)
/* General function to get information about memory status from proc
filesystem. */

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
/* Copyright (C) 1996, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -31,20 +31,16 @@ extern int sysinfo __P ((struct sysinfo *__info));
/* Return number of configured processors. */
extern int __get_nprocs_conf __P ((void));
extern int get_nprocs_conf __P ((void));
/* Return number of available processors. */
extern int __get_nprocs __P ((void));
extern int get_nprocs __P ((void));
/* Return number of physical pages of memory in the system. */
extern int __get_phys_pages __P ((void));
extern int get_phys_pages __P ((void));
/* Return number of available physical pages of memory in the system. */
extern int __get_avphys_pages __P ((void));
extern int get_avphys_pages __P ((void));
__END_DECLS