Пример #1
0
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;
}
Пример #2
0
static int
efab_eplock_lock_wait_rsop(ci_private_t *priv, void *unused)
{
  if (priv->thr == NULL)
    return -EINVAL;
  return efab_eplock_lock_wait(&priv->thr->netif);
}