]> git.lyx.org Git - lyx.git/blobdiff - src/Server.cpp
* Call metrics of the parameters with the correct font in MathMacros, for example
[lyx.git] / src / Server.cpp
index 7843997ca5c31ba83a22fa4d1c6f99963b19b896..7d4b0c3b001af3dc26c0183bdf779cbb80018d50 100644 (file)
 #include <config.h>
 
 #include "Server.h"
-#include "support/debug.h"
 #include "FuncRequest.h"
 #include "LyXAction.h"
 #include "LyXFunc.h"
+
 #include "frontends/Application.h"
 
+#include "support/debug.h"
 #include "support/FileName.h"
 #include "support/lstrings.h"
 
@@ -251,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.
@@ -272,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_);
@@ -287,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;
@@ -494,7 +503,7 @@ void Server::callback(string const & msg)
 }
 
 
-// Send a notify messge to a client, called by WorkAreaKeyPress
+// Send a notify message to a client, called by WorkAreaKeyPress
 void Server::notifyClient(string const & s)
 {
        pipes_.send("NOTIFY:" + s + "\n");