Lines Matching refs:CLIENT
27 struct CLIENT {
29 struct CLIENT *next;
33 /* We insist that there is only one outstanding call for a client at any
35 supporting multiple outstanding RPCs on a client, we will have to
71 static volatile struct CLIENT *clients;
73 /* There's one of these for each RPC client which has received an RPC call. */
76 CLIENT *client = (CLIENT *)__u;
78 (client->xdr->x_prog | 0x01000000),
79 client->xdr->x_vers);
80 pthread_mutex_lock(&client->wait_cb_lock);
81 while (client->cb_stop == 0) {
82 if (!client->got_cb)
83 pthread_cond_wait(&client->wait_cb,
84 &client->wait_cb_lock);
89 if (!client->got_cb) {
91 (client->xdr->x_prog | 0x01000000),
92 client->xdr->x_vers);
95 client->got_cb = 0;
98 * client.
103 ntohl(((uint32 *)(client->xdr->in_msg))[RPC_OFFSET+3]);
105 ntohl(((uint32 *)(client->xdr->in_msg))[RPC_OFFSET+4]);
111 "callback client %08x:%08x.\n",
112 client->xdr->x_prog,
113 client->xdr->x_vers,
114 ntohl(((uint32 *)(client->xdr->in_msg))[RPC_OFFSET]),
115 client->xdr,
117 /* We transplant the xdr of the client into the entry
118 representing the callback client in the list of servers.
119 Note that since we hold the wait_cb_lock for this client,
120 if another call for this callback client arrives before
127 "callback client %08x:%08x!\n",
128 client->xdr->x_prog,
129 client->xdr->x_vers,
135 "callback client %08x:%08x.\n",
136 client->xdr->x_prog,
137 client->xdr->x_vers,
139 *svc_xdr = xdr_clone(client->xdr);
144 client->xdr->in_msg, client->xdr->in_len);
146 client->xdr->out_msg, client->xdr->out_next);
147 (*svc_xdr)->in_len = client->xdr->in_len;
148 (*svc_xdr)->out_next = client->xdr->out_next;
150 pthread_mutex_lock(&client->input_xdr_lock);
152 client->xdr->x_prog, client->xdr->x_vers);
153 client->input_xdr_busy = 0;
154 pthread_cond_signal(&client->input_xdr_wait);
155 pthread_mutex_unlock(&client->input_xdr_lock);
163 client->xdr->x_prog,
164 client->xdr->x_vers,
169 client->xdr->x_prog,
170 client->xdr->x_vers);
174 pthread_mutex_unlock(&client->wait_cb_lock);
178 (client->xdr->x_prog | 0x01000000),
179 client->xdr->x_vers);
200 pthread_mutex_lock(&rx_mutex); /* sync access to the client list */
201 CLIENT *client = (CLIENT *)clients;
202 for (; client; client = client->next) {
203 if (FD_ISSET(client->xdr->fd, &rfds)) {
212 pthread_mutex_lock(&client->input_xdr_lock);
213 while (client->input_xdr_busy) {
216 client->xdr->x_prog, client->xdr->x_vers);
218 &client->input_xdr_wait,
219 &client->input_xdr_lock);
222 client->xdr->x_prog, client->xdr->x_vers);
224 client->xdr->xops->read(client->xdr);
225 client->input_xdr_busy = 1;
226 pthread_mutex_unlock(&client->input_xdr_lock);
228 if (((uint32 *)(client->xdr->in_msg))[RPC_OFFSET+1] ==
230 /* Wake up the RPC client to receive its data. */
232 "grabbing mutex to wake up client.\n",
233 client->xdr->x_prog,
234 client->xdr->x_vers,
235 ntohl(((uint32 *)client->xdr->in_msg)[RPC_OFFSET]));
236 pthread_mutex_lock(&client->wait_reply_lock);
237 D("%08x:%08x got mutex, waking up client.\n",
238 client->xdr->x_prog,
239 client->xdr->x_vers);
240 pthread_cond_signal(&client->wait_reply);
241 pthread_mutex_unlock(&client->wait_reply_lock);
246 pthread_mutex_lock(&client->wait_cb_lock);
248 client->xdr->x_prog,
249 client->xdr->x_vers);
250 client->got_cb = 1;
251 if (client->cb_stop < 0) {
253 client->xdr->x_prog,
254 client->xdr->x_vers);
255 client->cb_stop = 0;
256 pthread_create(&client->cb_thread,
258 cb_context, client);
261 client->xdr->x_prog,
262 client->xdr->x_vers);
263 pthread_cond_signal(&client->wait_cb);
264 pthread_mutex_unlock(&client->wait_cb_lock);
274 CLIENT *trav = (CLIENT *)clients;
287 D("RPC-client RX thread exiting!\n");
293 CLIENT * client,
306 xdr_s_type *xdr = client->xdr;
308 pthread_mutex_lock(&client->lock);
325 client->xdr->x_prog,
326 client->xdr->x_vers);
336 client->xdr->x_prog,
337 client->xdr->x_vers);
342 pthread_mutex_lock(&client->wait_reply_lock);
344 client->xdr->x_prog, client->xdr->x_vers, client->xdr->xid);
352 client->xdr->x_prog, client->xdr->x_vers);
353 pthread_cond_wait(&client->wait_reply, &client->wait_reply_lock);
354 D("%08x:%08x received reply.\n", client->xdr->x_prog, client->xdr->x_vers);
359 client->xdr->x_prog, client->xdr->x_vers,
367 client->xdr->x_prog, client->xdr->x_vers);
368 if (!xdr_recv_reply_header (client->xdr, &reply_header)) {
370 client->xdr->x_prog, client->xdr->x_vers);
380 (uint32_t)client->xdr->x_prog, client->xdr->x_vers);
386 (uint32_t)client->xdr->x_prog, client->xdr->x_vers);
395 client->xdr->x_prog, client->xdr->x_vers);
400 client->xdr->x_prog, client->xdr->x_vers);
403 pthread_mutex_lock(&client->input_xdr_lock);
405 client->xdr->x_prog, client->xdr->x_vers);
406 client->input_xdr_busy = 0;
407 pthread_cond_signal(&client->input_xdr_wait);
408 pthread_mutex_unlock(&client->input_xdr_lock);
410 pthread_mutex_unlock(&client->wait_reply_lock);
412 pthread_mutex_unlock(&client->lock);
532 CLIENT *clnt_create(
538 CLIENT *client = calloc(1, sizeof(CLIENT));
539 if (client) {
550 client->xdr = xdr_init_common(name, 1 /* client XDR */);
551 if (!client->xdr) {
552 E("failed to initialize client (permissions?)!\n");
553 free(client);
557 client->xdr->x_prog = prog;
558 client->xdr->x_vers = vers;
559 client->cb_stop = -1; /* callback thread has not been started */
566 FD_SET(client->xdr->fd, &rx_fdset);
567 if (max_rxfd < client->xdr->fd)
568 max_rxfd = client->xdr->fd;
569 client->next = (CLIENT *)clients;
570 clients = client;
576 pthread_mutexattr_init(&client->lock_attr);
577 // pthread_mutexattr_settype(&client->lock_attr, PTHREAD_MUTEX_RECURSIVE);
578 pthread_mutex_init(&client->lock, &client->lock_attr);
579 pthread_mutex_init(&client->wait_reply_lock, &client->lock_attr);
580 pthread_cond_init(&client->wait_reply, NULL);
581 pthread_mutex_init(&client->wait_cb_lock, &client->lock_attr);
582 pthread_cond_init(&client->wait_cb, NULL);
583 pthread_mutex_init(&client->input_xdr_lock, &client->lock_attr);
584 pthread_cond_init(&client->input_xdr_wait, NULL);
589 return client;
592 void clnt_destroy(CLIENT *client) {
593 if (client) {
594 pthread_mutex_lock(&client->lock);
595 D("%08x:%08x destroying client\n",
596 client->xdr->x_prog,
597 client->xdr->x_vers);
600 if (!client->cb_stop) {
602 client->cb_stop = 1;
604 client->xdr->x_prog,
605 client->xdr->x_vers);
606 pthread_mutex_lock(&client->wait_cb_lock);
607 pthread_cond_signal(&client->wait_cb);
608 pthread_mutex_unlock(&client->wait_cb_lock);
610 client->xdr->x_prog,
611 client->xdr->x_vers);
612 pthread_join(client->cb_thread, NULL);
615 pthread_mutex_lock(&rx_mutex); /* sync access to the client list */
617 CLIENT *trav = (CLIENT *)clients, *prev = NULL;
619 if (trav == client) {
620 D("%08x:%08x removing from client list\n",
621 client->xdr->x_prog,
622 client->xdr->x_vers);
628 FD_CLR(client->xdr->fd, &rx_fdset);
639 pthread_mutex_unlock(&rx_mutex); /* sync access to the client list */
641 pthread_mutex_destroy(&client->input_xdr_lock);
642 pthread_cond_destroy(&client->input_xdr_wait);
644 pthread_mutex_destroy(&client->wait_reply_lock);
645 pthread_cond_destroy(&client->wait_reply);
646 xdr_destroy_common(client->xdr);
648 // FIXME: what happens when we lock the client while destroying it,
654 // client (and probably crash), and then we get to the destroy call
656 pthread_mutex_unlock(&client->lock);
657 pthread_mutex_destroy(&client->lock);
658 pthread_mutexattr_destroy(&client->lock_attr);
659 D("client destroy done\n");
660 free(client);