Lines Matching refs:lc

27  * \param lc  Storage for channel state
29 void lmp_chan_init(struct lmp_chan *lc)
31 assert(lc != NULL);
32 lc->connstate = LMP_DISCONNECTED;
33 waitset_chanstate_init(&lc->send_waitset, CHANTYPE_LMP_OUT);
34 lc->endpoint = NULL;
36 lc->prev = lc->next = NULL;
46 struct lmp_chan *lc = (void *)conn_id;
48 assert(lc->connstate == LMP_BIND_WAIT);
51 lc->connstate = LMP_CONNECTED;
52 lc->remote_cap = endpoint;
56 assert(lc->bind_continuation.handler != NULL);
57 lc->bind_continuation.handler(lc->bind_continuation.st, success, lc);
62 struct lmp_chan *lc = arg;
63 struct monitor_binding *b = lc->monitor_binding;
67 err = b->tx_vtbl.bind_lmp_client_request(b, NOP_CONT, lc->iref,
68 (uintptr_t)lc, lc->buflen_words,
69 lc->local_cap);
74 err = b->register_send(b, b->waitset, MKCONT(send_bind_cont,lc));
78 lc->bind_continuation.handler(lc->bind_continuation.st,
86 * \param lc Storage for channel state
92 errval_t lmp_chan_bind(struct lmp_chan *lc, struct lmp_bind_continuation cont,
98 lmp_chan_init(lc);
101 lc->iref = iref;
102 lc->buflen_words = buflen_words;
103 lc->bind_continuation = cont;
106 err = slot_alloc(&lc->local_cap);
108 waitset_chanstate_destroy(&lc->send_waitset);
113 err = lmp_endpoint_create_in_slot(buflen_words, lc->local_cap,
114 &lc->endpoint);
116 slot_free(lc->local_cap);
117 waitset_chanstate_destroy(&lc->send_waitset);
122 lc->connstate = LMP_BIND_WAIT;
123 struct monitor_binding *mb = lc->monitor_binding = get_monitor_binding();
125 MKCLOSURE(send_bind_cont, lc));
133 * \param lc Storage for channel state
139 errval_t lmp_chan_bind_to_endpoint(struct lmp_chan *lc, struct capref remoteep,
144 lmp_chan_init(lc);
146 lc->remote_cap = remoteep;
149 lc->buflen_words = buflen_words;
152 err = slot_alloc(&lc->local_cap);
154 waitset_chanstate_destroy(&lc->send_waitset);
161 waitset_chanstate_destroy(&lc->send_waitset);
166 err = lmp_endpoint_create_in_slot_with_iftype(buflen_words, lc->local_cap,
167 &lc->endpoint, epid.iftype);
169 slot_free(lc->local_cap);
170 waitset_chanstate_destroy(&lc->send_waitset);
175 lc->connstate = LMP_EP_WAIT_ACK;
181 void lmp_chan_destroy(struct lmp_chan *lc)
183 lc->connstate = LMP_DISCONNECTED;
184 cap_destroy(lc->local_cap);
186 if (lc->endpoint != NULL) {
187 lmp_endpoint_free(lc->endpoint);
191 if (waitset_chan_is_registered(&lc->send_waitset)) {
192 assert(lc->prev != NULL && lc->next != NULL);
195 if (lc->next == lc->prev) {
196 assert_disabled(lc->next == lc);
197 assert_disabled(disp->lmp_send_events_list == lc);
200 lc->prev->next = lc->next;
201 lc->next->prev = lc->prev;
206 lc->next = lc->prev = NULL;
210 waitset_chanstate_destroy(&lc->send_waitset);
215 struct lmp_chan *lc;
240 if (st->lc != NULL) {
241 lmp_chan_destroy(st->lc);
256 struct lmp_chan *lc = NULL;
261 err = e->lmp_connect_callback(e->connect_cb_st, buflen_words, endpoint, &lc);
267 assert(lc != NULL);
275 st->lc = lc;
279 st->args.conn_id = (uintptr_t)lc;
280 st->args.ep = lc->local_cap;
293 * \param lc Storage for channel state
297 errval_t lmp_chan_accept(struct lmp_chan *lc,
302 lmp_chan_init(lc);
303 lc->remote_cap = endpoint;
306 err = slot_alloc(&lc->local_cap);
312 err = lmp_endpoint_create_in_slot(buflen_words, lc->local_cap,
313 &lc->endpoint);
315 slot_free(lc->local_cap);
320 lc->connstate = LMP_CONNECTED;
327 * \param lc Storage for channel state
332 errval_t lmp_chan_endpoint_create_with_iftype(struct lmp_chan *lc, size_t buflen_words,
337 lmp_chan_init(lc);
338 lc->local_cap = endpoint;
341 err = lmp_endpoint_create_in_slot_with_iftype(buflen_words, lc->local_cap,
342 &lc->endpoint, iftype);
348 lc->connstate = LMP_EP_WAIT_CAP;
354 * \param lc Storage for channel state
358 errval_t lmp_chan_endpoint_create(struct lmp_chan *lc, size_t buflen_words,
361 return lmp_chan_endpoint_create_with_iftype(lc, buflen_words, endpoint, 0);
372 * \param lc LMP channel
376 errval_t lmp_chan_register_send(struct lmp_chan *lc, struct waitset *ws,
379 assert(lc != NULL);
382 errval_t err = waitset_chan_register(ws, &lc->send_waitset, closure);
388 assert(lc->next == NULL && lc->prev == NULL);
392 dp->lmp_send_events_list = lc;
393 lc->next = lc->prev = lc;
395 lc->prev = dp->lmp_send_events_list->prev;
396 lc->next = dp->lmp_send_events_list;
397 lc->prev->next = lc;
398 lc->next->prev = lc;
408 * \param lc LMP channel
410 errval_t lmp_chan_deregister_send(struct lmp_chan *lc)
412 assert(lc != NULL);
413 errval_t err = waitset_chan_deregister(&lc->send_waitset);
419 assert(lc->next != NULL && lc->prev != NULL);
422 if (lc->next == lc->prev) {
423 assert_disabled(dp->lmp_send_events_list == lc);
426 lc->prev->next = lc->next;
427 lc->next->prev = lc->prev;
428 if (dp->lmp_send_events_list == lc) {
429 dp->lmp_send_events_list = lc->next;
433 lc->prev = lc->next = NULL;
443 * \param lc LMP channel
446 void lmp_chan_migrate_send(struct lmp_chan *lc, struct waitset *ws)
448 assert(lc != NULL);
449 waitset_chan_migrate(&lc->send_waitset, ws);
458 * \param lc LMP channel
460 errval_t lmp_chan_alloc_recv_slot(struct lmp_chan *lc)
469 lmp_chan_set_recv_slot(lc, slot);
486 struct lmp_chan *lc, *first = dp->lmp_send_events_list, *next;
489 for (lc = first; lc != NULL; lc = next) {
490 next = lc->next;
492 err = waitset_chan_trigger_disabled(&lc->send_waitset, handle);
495 lc->next = lc->prev = NULL;