aboutsummaryrefslogtreecommitdiffstats
path: root/lib/libc/rpc/svc.c
diff options
context:
space:
mode:
authorMartin Blapp <mbr@FreeBSD.org>2003-01-16 08:53:59 +0000
committerMartin Blapp <mbr@FreeBSD.org>2003-01-16 08:53:59 +0000
commit18d292b3f5a7b4ed47b7f11bbc4fd8f5e66741eb (patch)
treeb1b505a5294d16d42eee416ae9ad292af9f1df55 /lib/libc/rpc/svc.c
parentfd22bdcda356e40c75b7138cad3bb7cf8d00c806 (diff)
downloadsrc-18d292b3f5a7b4ed47b7f11bbc4fd8f5e66741eb.tar.gz
src-18d292b3f5a7b4ed47b7f11bbc4fd8f5e66741eb.zip
MFC: Implement non-blocking tcp-connections
Reviewed by: rwatson Approved by: re (rwatson) Obtained from: NetBSD
Notes
Notes: svn path=/releng/5.0/; revision=109376
Diffstat (limited to 'lib/libc/rpc/svc.c')
-rw-r--r--lib/libc/rpc/svc.c67
1 files changed, 51 insertions, 16 deletions
diff --git a/lib/libc/rpc/svc.c b/lib/libc/rpc/svc.c
index c4584ed80ed9..9d7435e45ffa 100644
--- a/lib/libc/rpc/svc.c
+++ b/lib/libc/rpc/svc.c
@@ -63,8 +63,6 @@ __FBSDID("$FreeBSD$");
#include "rpc_com.h"
-static SVCXPRT **xports;
-
#define RQCRED_SIZE 400 /* this size is excessive */
#define SVC_VERSQUIET 0x0001 /* keep quiet about vers mismatch */
@@ -91,6 +89,7 @@ extern rwlock_t svc_fd_lock;
static struct svc_callout *svc_find(rpcprog_t, rpcvers_t,
struct svc_callout **, char *);
+static void __xprt_do_unregister (SVCXPRT *xprt, bool_t dolock);
/* *************** SVCXPRT related stuff **************** */
@@ -108,27 +107,40 @@ xprt_register(xprt)
sock = xprt->xp_fd;
rwlock_wrlock(&svc_fd_lock);
- if (xports == NULL) {
- xports = (SVCXPRT **)
+ if (__svc_xports == NULL) {
+ __svc_xports = (SVCXPRT **)
mem_alloc(FD_SETSIZE * sizeof(SVCXPRT *));
- if (xports == NULL)
+ if (__svc_xports == NULL)
return;
- memset(xports, '\0', FD_SETSIZE * sizeof(SVCXPRT *));
+ memset(__svc_xports, '\0', FD_SETSIZE * sizeof(SVCXPRT *));
}
if (sock < FD_SETSIZE) {
- xports[sock] = xprt;
+ __svc_xports[sock] = xprt;
FD_SET(sock, &svc_fdset);
svc_maxfd = max(svc_maxfd, sock);
}
rwlock_unlock(&svc_fd_lock);
}
+void
+xprt_unregister(SVCXPRT *xprt)
+{
+ __xprt_do_unregister(xprt, TRUE);
+}
+
+void
+__xprt_unregister_unlocked(SVCXPRT *xprt)
+{
+ __xprt_do_unregister(xprt, FALSE);
+}
+
/*
* De-activate a transport handle.
*/
-void
-xprt_unregister(xprt)
+static void
+__xprt_do_unregister(xprt, dolock)
SVCXPRT *xprt;
+ bool_t dolock;
{
int sock;
@@ -136,17 +148,19 @@ xprt_unregister(xprt)
sock = xprt->xp_fd;
- rwlock_wrlock(&svc_fd_lock);
- if ((sock < FD_SETSIZE) && (xports[sock] == xprt)) {
- xports[sock] = NULL;
+ if (dolock)
+ rwlock_wrlock(&svc_fd_lock);
+ if ((sock < FD_SETSIZE) && (__svc_xports[sock] == xprt)) {
+ __svc_xports[sock] = NULL;
FD_CLR(sock, &svc_fdset);
if (sock >= svc_maxfd) {
for (svc_maxfd--; svc_maxfd>=0; svc_maxfd--)
- if (xports[svc_maxfd])
+ if (__svc_xports[svc_maxfd])
break;
}
}
- rwlock_unlock(&svc_fd_lock);
+ if (dolock)
+ rwlock_unlock(&svc_fd_lock);
}
/*
@@ -611,7 +625,7 @@ svc_getreq_common(fd)
r.rq_clntcred = &(cred_area[2*MAX_AUTH_BYTES]);
rwlock_rdlock(&svc_fd_lock);
- xprt = xports[fd];
+ xprt = __svc_xports[fd];
rwlock_unlock(&svc_fd_lock);
if (xprt == NULL)
/* But do we control sock? */
@@ -667,7 +681,7 @@ svc_getreq_common(fd)
* If so, then break.
*/
rwlock_rdlock(&svc_fd_lock);
- if (xprt != xports[fd]) {
+ if (xprt != __svc_xports[fd]) {
rwlock_unlock(&svc_fd_lock);
break;
}
@@ -715,3 +729,24 @@ svc_getreq_poll(pfdp, pollretval)
}
}
}
+
+bool_t
+rpc_control(int what, void *arg)
+{
+ int val;
+
+ switch (what) {
+ case RPC_SVC_CONNMAXREC_SET:
+ val = *(int *)arg;
+ if (val <= 0)
+ return FALSE;
+ __svc_maxrec = val;
+ return TRUE;
+ case RPC_SVC_CONNMAXREC_GET:
+ *(int *)arg = __svc_maxrec;
+ return TRUE;
+ default:
+ break;
+ }
+ return FALSE;
+}