LWMsgStatus lwmsg_assoc_acquire_call( LWMsgAssoc* assoc, LWMsgCall** call ) { LWMsgStatus status = LWMSG_STATUS_SUCCESS; LWMsgSession* session = NULL; if (assoc->call.in_use) { BAIL_ON_ERROR(status = LWMSG_STATUS_BUSY); } else { switch (lwmsg_assoc_get_state(assoc)) { case LWMSG_ASSOC_STATE_IDLE: break; case LWMSG_ASSOC_STATE_NOT_ESTABLISHED: BAIL_ON_ERROR(status = assoc->aclass->get_session(assoc, &session)); BAIL_ON_ERROR(status = lwmsg_assoc_connect(assoc, session)); break; default: BAIL_ON_ERROR(status = LWMSG_STATUS_INVALID_STATE); } assoc->call.in_use = LWMSG_TRUE; *call = LWMSG_CALL(&assoc->call); } error: return status; }
static LWMsgStatus lwmsg_connection_set_nonblock( LWMsgAssoc* assoc, LWMsgBool nonblock ) { LWMsgStatus status = LWMSG_STATUS_SUCCESS; ConnectionPrivate* priv = CONNECTION_PRIVATE(assoc); switch (lwmsg_assoc_get_state(assoc)) { case LWMSG_ASSOC_STATE_NOT_ESTABLISHED: case LWMSG_ASSOC_STATE_IDLE: case LWMSG_ASSOC_STATE_CLOSED: priv->is_nonblock = nonblock; break; default: ASSOC_RAISE_ERROR(assoc, status = LWMSG_STATUS_INVALID_STATE, "Cannot set blocking while connection is busy"); } error: return status; }
static void lwmsg_peer_task_update_blocked( PeerAssocTask* task ) { switch (lwmsg_assoc_get_state(task->assoc)) { case LWMSG_ASSOC_STATE_BLOCKED_SEND: task->send_blocked = LWMSG_TRUE; task->recv_blocked = LWMSG_FALSE; break; case LWMSG_ASSOC_STATE_BLOCKED_RECV: task->recv_blocked = LWMSG_TRUE; task->send_blocked = LWMSG_FALSE; break; case LWMSG_ASSOC_STATE_BLOCKED_SEND_RECV: task->send_blocked = task->recv_blocked = LWMSG_TRUE; break; default: task->send_blocked = task->recv_blocked = LWMSG_FALSE; break; } }