{
virConsolePtr con = opaque;
+ virObjectLock(con);
+
if (events & VIR_STREAM_EVENT_READABLE) {
size_t avail = con->streamToTerminal.length -
con->streamToTerminal.offset;
if (VIR_REALLOC_N(con->streamToTerminal.data,
con->streamToTerminal.length + 1024) < 0) {
virConsoleShutdown(con);
- return;
+ goto cleanup;
}
con->streamToTerminal.length += 1024;
avail += 1024;
con->streamToTerminal.offset,
avail);
if (got == -2)
- return; /* blocking */
+ goto cleanup; /* blocking */
if (got <= 0) {
virConsoleShutdown(con);
- return;
+ goto cleanup;
}
con->streamToTerminal.offset += got;
if (con->streamToTerminal.offset)
con->terminalToStream.data,
con->terminalToStream.offset);
if (done == -2)
- return; /* blocking */
+ goto cleanup; /* blocking */
if (done < 0) {
virConsoleShutdown(con);
- return;
+ goto cleanup;
}
memmove(con->terminalToStream.data,
con->terminalToStream.data + done,
events & VIR_STREAM_EVENT_HANGUP) {
virConsoleShutdown(con);
}
+
+ cleanup:
+ virObjectUnlock(con);
}
{
virConsolePtr con = opaque;
+ virObjectLock(con);
+
if (events & VIR_EVENT_HANDLE_READABLE) {
size_t avail = con->terminalToStream.length -
con->terminalToStream.offset;
if (VIR_REALLOC_N(con->terminalToStream.data,
con->terminalToStream.length + 1024) < 0) {
virConsoleShutdown(con);
- return;
+ goto cleanup;
}
con->terminalToStream.length += 1024;
avail += 1024;
if (got < 0) {
if (errno != EAGAIN)
virConsoleShutdown(con);
- return;
+ goto cleanup;
}
if (got == 0) {
virConsoleShutdown(con);
- return;
+ goto cleanup;
}
if (con->terminalToStream.data[con->terminalToStream.offset] == con->escapeChar) {
virConsoleShutdown(con);
- return;
+ goto cleanup;
}
con->terminalToStream.offset += got;
events & VIR_EVENT_HANDLE_HANGUP) {
virConsoleShutdown(con);
}
+
+ cleanup:
+ virObjectUnlock(con);
}
{
virConsolePtr con = opaque;
+ virObjectLock(con);
+
if (events & VIR_EVENT_HANDLE_WRITABLE &&
con->streamToTerminal.offset) {
ssize_t done;
if (done < 0) {
if (errno != EAGAIN)
virConsoleShutdown(con);
- return;
+ goto cleanup;
}
memmove(con->streamToTerminal.data,
con->streamToTerminal.data + done,
events & VIR_EVENT_HANDLE_HANGUP) {
virConsoleShutdown(con);
}
+
+ cleanup:
+ virObjectUnlock(con);
}