mh->nReady = 0;
mh->nConns = nConns;
-#ifdef RX_ENABLE_LOCKS
MUTEX_INIT(&mh->lock, "rx_multi_lock", MUTEX_DEFAULT, 0);
CV_INIT(&mh->cv, "rx_multi_cv", CV_DEFAULT, 0);
-#endif /* RX_ENABLE_LOCKS */
for (i = 0; i < nConns; i++) {
struct rx_call *call;
call = mh->calls[i] = rx_NewCall(conns[i]);
int index;
SPLVAR;
NETPRI;
-#ifdef RX_ENABLE_LOCKS
MUTEX_ENTER(&mh->lock);
-#endif /* RX_ENABLE_LOCKS */
while (mh->nextReady == mh->firstNotReady) {
if (mh->nReady == mh->nConns) {
-#ifdef RX_ENABLE_LOCKS
MUTEX_EXIT(&mh->lock);
-#endif /* RX_ENABLE_LOCKS */
USERPRI;
return -1;
}
}
index = *(mh->nextReady);
(mh->nextReady) += 1;
-#ifdef RX_ENABLE_LOCKS
MUTEX_EXIT(&mh->lock);
-#endif /* RX_ENABLE_LOCKS */
USERPRI;
return index;
}
int index)
{
struct multi_handle *mh = (struct multi_handle *)amh;
-#ifdef RX_ENABLE_LOCKS
MUTEX_ENTER(&mh->lock);
-#endif /* RX_ENABLE_LOCKS */
*mh->firstNotReady++ = index;
mh->nReady++;
#ifdef RX_ENABLE_LOCKS
CV_SIGNAL(&mh->cv);
- MUTEX_EXIT(&mh->lock);
#else /* RX_ENABLE_LOCKS */
osi_rxWakeup(mh);
#endif /* RX_ENABLE_LOCKS */
+ MUTEX_EXIT(&mh->lock);
}
/* Called when the multi rx call is over, or when the user aborts it (by using the macro multi_Abort) */
if (call)
rx_EndCall(call, RX_USER_ABORT);
}
-#ifdef RX_ENABLE_LOCKS
MUTEX_DESTROY(&mh->lock);
CV_DESTROY(&mh->cv);
-#endif /* RX_ENABLE_LOCKS */
osi_Free(mh->calls, sizeof(struct rx_call *) * nCalls);
osi_Free(mh->ready, sizeof(short *) * nCalls);
osi_Free(mh, sizeof(struct multi_handle));
if (call)
rx_EndCall(call, 0);
}
-#ifdef RX_ENABLE_LOCKS
MUTEX_DESTROY(&mh->lock);
CV_DESTROY(&mh->cv);
-#endif /* RX_ENABLE_LOCKS */
osi_Free(mh->calls, sizeof(struct rx_call *) * nCalls);
osi_Free(mh->ready, sizeof(short *) * nCalls);
osi_Free(mh, sizeof(struct multi_handle));