From 964a4fac799b3f266f1d1347d3a7613963e8b386 Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Sun, 5 Oct 2008 00:50:39 +0000 Subject: [PATCH] Fix bug 1784 http://bugzilla.lyx.org/show_bug.cgi?id=1784 git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@26737 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/Server.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Server.cpp b/src/Server.cpp index 99be0afa5a..7d4b0c3b00 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -252,6 +252,12 @@ void LyXComm::read_ready() int const charbuf_size = 100; char charbuf[charbuf_size]; + // As O_NONBLOCK is set, until no data is available for reading, + // read() doesn't block but returns -1 and set errno to EAGAIN. + // After a client that opened the pipe for writing, closes it + // (and no other client is using the pipe), read() would always + // return 0 and thus the connection has to be reset. + errno = 0; int status; // the single = is intended here. @@ -273,12 +279,13 @@ void LyXComm::read_ready() clientcb_(client_, cmd); //\n or not \n? } - } - if (errno == EAGAIN) { - errno = 0; - return; - } - if (errno != 0) { + } else { + if (errno == EAGAIN) { + // Nothing to read, continue + errno = 0; + return; + } + // An error occurred, better bailing out LYXERR0("LyXComm: " << strerror(errno)); if (!read_buffer_.empty()) { LYXERR0("LyXComm: truncated command: " << read_buffer_); @@ -288,8 +295,9 @@ void LyXComm::read_ready() } } - // The connection gets reset in errno != EAGAIN - // Why does it need to be reset if errno == 0? + // The connection gets reset when read() returns 0 (meaning that the + // last client closed the pipe) or an error occurred, in which case + // read() returns -1 and errno != EAGAIN. closeConnection(); openConnection(); errno = 0;