MUTEX_ENTER(&call->lock);
}
if (call->app.mode == RX_MODE_SENDING) {
- MUTEX_EXIT(&call->lock);
- rxi_FlushWrite(call);
- MUTEX_ENTER(&call->lock);
+ rxi_FlushWriteLocked(call);
}
rxi_calltrace(RX_CALL_END, call);
/* Call goes to hold state until reply packets are acknowledged */
extern int rx_WritevProc(struct rx_call *call, struct iovec *iov, int nio,
int nbytes);
extern void rxi_FlushWrite(struct rx_call *call);
+extern void rxi_FlushWriteLocked(struct rx_call *call);
extern void rx_FlushWrite(struct rx_call *call);
return 0;
}
if (call->app.mode == RX_MODE_SENDING) {
- MUTEX_EXIT(&call->lock);
- rxi_FlushWrite(call);
- MUTEX_ENTER(&call->lock);
+ rxi_FlushWriteLocked(call);
continue;
}
}
}
/* Flush any buffered data to the stream, switch to read mode
- * (clients) or to EOF mode (servers)
+ * (clients) or to EOF mode (servers). If 'locked' is nonzero, call->lock must
+ * be already held.
*
* LOCKS HELD: called at netpri.
*/
-void
-rxi_FlushWrite(struct rx_call *call)
+static void
+FlushWrite(struct rx_call *call, int locked)
{
struct rx_packet *cp = NULL;
}
#endif
- MUTEX_ENTER(&call->lock);
+ if (!locked) {
+ MUTEX_ENTER(&call->lock);
+ }
+
if (call->error)
call->app.mode = RX_MODE_ERROR;
if (!(call->flags & RX_CALL_FAST_RECOVER)) {
rxi_Start(call, 0);
}
- MUTEX_EXIT(&call->lock);
+ if (!locked) {
+ MUTEX_EXIT(&call->lock);
+ }
}
}
+void
+rxi_FlushWrite(struct rx_call *call)
+{
+ FlushWrite(call, 0);
+}
+
+void
+rxi_FlushWriteLocked(struct rx_call *call)
+{
+ FlushWrite(call, 1);
+}
+
/* Flush any buffered data to the stream, switch to read mode
* (clients) or to EOF mode (servers) */
void
{
SPLVAR;
NETPRI;
- rxi_FlushWrite(call);
+ FlushWrite(call, 0);
USERPRI;
}