Frees the resources allocated to service a client request.
Network Services Library (libnsl.a)
The svc_done subroutine frees the resources allocated to service a client request. The subroutine is used when the server is in the user-multithreaded mode. If used in the single-threaded mode or in the AUTO-MT mode, the subroutine has no effect. This subroutine is normally called in a service procedure before the return, when the remote procedure call (RPC) request has been serviced or when any abnormal condition occurs.
Item | Description |
---|---|
xprt | Identifies the service handle. |
#include <stdlib.h>
#include <rpc/rpc.h>
#include <pthread.h>
rpcprog_t prognum;
rpcvers_t progver;
/* create threads to serv multiple client requests */
void * thread_func(void * xprt)
{
int result = 3;
if(svc_sendreply((SVCXPRT *) xprt, (xdrproc_t) xdr_int,
(char *) &result) == FALSE)
svcerr_systemerr(xprt);
/* call to svc_done which frees resources allocated */
svc_done((SVCXPRT *)xprt);
pthread_exit(0);
}
/* dispatch routine */
static void dispatch(struct svc_req * request, SVCXPRT * xprt)
{
int ret;
pthread_t tid;
if((ret = pthread_create(&tid,NULL,thread_func,
(void *)xprt)) != 0)
{
fprintf(stderr,"\nError in pthread_create.\n");
exit(2);
}
}
int main()
{
int num,mode;
prognum = 0x3fffffffL;
progver = 0x1L;
svc_unreg(prognum,progver);
/* register RPC service */
num = svc_create(dispatch, prognum, progver, "tcp");
if (num == 0)
{
fprintf(stderr, "Error in svc_create.\n");
exit(EXIT_FAILURE);
}
/* server in USER-MT mode */
mode = RPC_SVC_MT_USER;
if(rpc_control(RPC_SVC_MTMODE_SET,&mode) == FALSE)
{
fprintf(stderr,"\nError in rpc_control!\n");
exit(EXIT_FAILURE);
}
svc_run();
exit(1);
}