ci_inline int sock_sleep__on_wakeup(ci_waiter_t* waiter, void* opaque_trs, void* opaque_op, int rc, ci_waitable_timeout_t timeout) { tcp_helper_resource_t* trs = (tcp_helper_resource_t*) opaque_trs; oo_tcp_sock_sleep_t* op = (oo_tcp_sock_sleep_t*) opaque_op; tcp_helper_endpoint_t* ep = ci_trs_ep_get(trs, op->sock_id); if( rc == -ETIMEDOUT ) rc = -EAGAIN; ci_waiter_post(waiter, &ep->waitq); if( rc == 0 && (op->lock_flags & CI_SLEEP_NETIF_RQ) ) if( ! (trs->netif.state->lock.lock & CI_EPLOCK_UNLOCKED) ) { rc = efab_eplock_lock_wait(&trs->netif CI_BLOCKING_CTX_ARG(CI_WAITER_BCTX(waiter)), 0); rc = CI_WAITER_CONVERT_REENTRANT(rc); } if( rc == 0 && (op->lock_flags & CI_SLEEP_SOCK_RQ) ) { citp_waitable* w = SP_TO_WAITABLE(&trs->netif, ep->id); if( w->lock.wl_val & OO_WAITABLE_LK_LOCKED ) { rc = efab_tcp_helper_sock_lock_slow(trs, op->sock_id CI_BLOCKING_CTX_ARG( CI_WAITER_BCTX(waiter))); rc = CI_WAITER_CONVERT_REENTRANT(rc); } } if( op->timeout_ms ) { op->timeout_ms = jiffies_to_msecs(timeout); if( op->timeout_ms == 0 ) rc = -EAGAIN; } return rc; }
static int efab_tcp_helper_sock_lock_slow_rsop(ci_private_t* priv, void *p_sock_id) { if (priv->thr == NULL) return -EINVAL; return efab_tcp_helper_sock_lock_slow(priv->thr, *(oo_sp *)p_sock_id); }