rxevent_Cancel(call->delayedAckEvent,
call,
RX_CALL_REFCOUNT_DELAY);
+ MUTEX_ENTER(&rx_refcnt_mutex);
CALL_HOLD(call, RX_CALL_REFCOUNT_DELAY);
- call->delayedAckEvent =
+ MUTEX_EXIT(&rx_refcnt_mutex);
+ call->delayedAckEvent =
rxevent_PostNow(&when, &now,
rxi_SendDelayedAck, call,
0);
osi_rxSleep(&call->rq);
#endif
}
- /* cp is no longer valid since we may have given up the lock */
cp = call->currentPacket;
call->startWait = 0;
SPLVAR;
/* Free any packets from the last call to ReadvProc/WritevProc */
- NETPRI;
- MUTEX_ENTER(&call->lock);
if (!queue_IsEmpty(&call->iovq)) {
#ifdef RXDEBUG_PACKET
call->iovqc -=
tnLeft = call->nLeft;
if (!call->error && tcurlen > nbytes && tnLeft > nbytes) {
tcurpos = call->curpos;
- memcpy(buf, tcurpos, nbytes);
+ memcpy(buf, tcurpos, nbytes);
+
call->curpos = tcurpos + nbytes;
call->curlen = tcurlen - nbytes;
call->nLeft = tnLeft - nbytes;
rxi_FreePacket(call->currentPacket);
call->currentPacket = (struct rx_packet *)0;
}
- bytes = nbytes;
- } else
- bytes = rxi_ReadProc(call, buf, nbytes);
+ return nbytes;
+ }
+ NETPRI;
+ MUTEX_ENTER(&call->lock);
+ bytes = rxi_ReadProc(call, buf, nbytes);
MUTEX_EXIT(&call->lock);
USERPRI;
return bytes;
SPLVAR;
/* Free any packets from the last call to ReadvProc/WritevProc */
- NETPRI;
- MUTEX_ENTER(&call->lock);
if (!queue_IsEmpty(&call->iovq)) {
#ifdef RXDEBUG_PACKET
call->iovqc -=
if (!call->error && tcurlen >= sizeof(afs_int32)
&& tnLeft >= sizeof(afs_int32)) {
tcurpos = call->curpos;
- memcpy((char *)value, tcurpos, sizeof(afs_int32));
- call->curpos = tcurpos + sizeof(afs_int32);
+
+ memcpy((char *)value, tcurpos, sizeof(afs_int32));
+
+ call->curpos = tcurpos + sizeof(afs_int32);
call->curlen = (u_short)(tcurlen - sizeof(afs_int32));
call->nLeft = (u_short)(tnLeft - sizeof(afs_int32));
if (!call->nLeft && call->currentPacket != NULL) {
rxi_FreePacket(call->currentPacket);
call->currentPacket = (struct rx_packet *)0;
}
- bytes = sizeof(afs_int32);
- } else
- bytes = rxi_ReadProc(call, (char *)value, sizeof(afs_int32));
+ return sizeof(afs_int32);
+ }
+ NETPRI;
+ MUTEX_ENTER(&call->lock);
+ bytes = rxi_ReadProc(call, (char *)value, sizeof(afs_int32));
MUTEX_EXIT(&call->lock);
USERPRI;
+
return bytes;
}
|| clock_Gt(&call->delayedAckEvent->eventTime, &when)) {
rxevent_Cancel(call->delayedAckEvent, call,
RX_CALL_REFCOUNT_DELAY);
+ MUTEX_ENTER(&rx_refcnt_mutex);
CALL_HOLD(call, RX_CALL_REFCOUNT_DELAY);
+ MUTEX_EXIT(&rx_refcnt_mutex);
call->delayedAckEvent =
rxevent_PostNow(&when, &now, rxi_SendDelayedAck, call, 0);
}
SPLVAR;
/* Free any packets from the last call to ReadvProc/WritevProc */
- NETPRI;
- MUTEX_ENTER(&call->lock);
if (queue_IsNotEmpty(&call->iovq)) {
#ifdef RXDEBUG_PACKET
call->iovqc -=
tnFree = (int)call->nFree;
if (!call->error && tcurlen >= nbytes && tnFree >= nbytes) {
tcurpos = call->curpos;
+
memcpy(tcurpos, buf, nbytes);
call->curpos = tcurpos + nbytes;
call->curlen = (u_short)(tcurlen - nbytes);
call->nFree = (u_short)(tnFree - nbytes);
- bytes = nbytes;
- } else
- bytes = rxi_WriteProc(call, buf, nbytes);
+ return nbytes;
+ }
+ NETPRI;
+ MUTEX_ENTER(&call->lock);
+ bytes = rxi_WriteProc(call, buf, nbytes);
MUTEX_EXIT(&call->lock);
USERPRI;
return bytes;
char *tcurpos;
SPLVAR;
- /* Free any packets from the last call to ReadvProc/WritevProc */
- NETPRI;
- MUTEX_ENTER(&call->lock);
if (queue_IsNotEmpty(&call->iovq)) {
#ifdef RXDEBUG_PACKET
call->iovqc -=
if (!call->error && tcurlen >= sizeof(afs_int32)
&& tnFree >= sizeof(afs_int32)) {
tcurpos = call->curpos;
+
if (!((size_t)tcurpos & (sizeof(afs_int32) - 1))) {
*((afs_int32 *) (tcurpos)) = *value;
} else {
call->curpos = tcurpos + sizeof(afs_int32);
call->curlen = (u_short)(tcurlen - sizeof(afs_int32));
call->nFree = (u_short)(tnFree - sizeof(afs_int32));
- bytes = sizeof(afs_int32);
- } else
- bytes = rxi_WriteProc(call, (char *)value, sizeof(afs_int32));
+ return sizeof(afs_int32);
+ }
+ NETPRI;
+ MUTEX_ENTER(&call->lock);
+ bytes = rxi_WriteProc(call, (char *)value, sizeof(afs_int32));
MUTEX_EXIT(&call->lock);
USERPRI;
return bytes;