]> git.lyx.org Git - features.git/commitdiff
Fix bug 641 (Detect stale lyxpipes after crash)
authorEnrico Forestieri <forenr@lyx.org>
Wed, 26 Nov 2008 01:22:05 +0000 (01:22 +0000)
committerEnrico Forestieri <forenr@lyx.org>
Wed, 26 Nov 2008 01:22:05 +0000 (01:22 +0000)
http://bugzilla.lyx.org/show_bug.cgi?id=641

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@27708 a592a061-630c-0410-9148-cb99ea01b6c8

src/Server.cpp
src/support/FileName.cpp

index ebaa01c9778be950a656e85ff24cf95f21999e74..294943e3605a7f7228c3f0f2826cd2257ced6e47 100644 (file)
@@ -178,13 +178,40 @@ void LyXComm::closeConnection()
 
 int LyXComm::startPipe(string const & file, bool write)
 {
+       static bool stalepipe = false;
        FileName const filename(file);
-       if (::access(filename.toFilesystemEncoding().c_str(), F_OK) == 0) {
-               lyxerr << "LyXComm: Pipe " << filename << " already exists.\n"
-                      << "If no other LyX program is active, please delete"
-                       " the pipe by hand and try again." << endl;
-               pipename_.erase();
-               return -1;
+       if (filename.exists()) {
+               if (!write) {
+                       // Let's see whether we have a stale pipe.
+                       errno = 0;
+                       int fd = ::open(filename.toFilesystemEncoding().c_str(),
+                                       O_WRONLY | O_NONBLOCK);
+                       if (fd >= 0) {
+                               // Another LyX instance is using it.
+                               close(fd);
+                       } else if (errno == ENXIO) {
+                               // No process is reading from the other end.
+                               stalepipe = true;
+                               LYXERR(Debug::LYXSERVER,
+                                       "LyXComm: trying to remove "
+                                       << filename);
+                               filename.removeFile();
+                       }
+               } else if (stalepipe) {
+                       LYXERR(Debug::LYXSERVER, "LyXComm: trying to remove "
+                               << filename);
+                       filename.removeFile();
+                       stalepipe = false;
+               }
+               if (filename.exists()) {
+                       lyxerr << "LyXComm: Pipe " << filename
+                              << " already exists.\nIf no other LyX program"
+                                 " is active, please delete the pipe by hand"
+                                 " and try again."
+                              << endl;
+                       pipename_.erase();
+                       return -1;
+               }
        }
 
        if (::mkfifo(filename.toFilesystemEncoding().c_str(), 0600) < 0) {
index 737bfd9f047e39cd6f1f4f46ae1fc4dd86f6c6c2..253ba88c2ed5cbe85a98702650ad072e001f2b8f 100644 (file)
@@ -556,6 +556,7 @@ unsigned long FileName::checksum() const
 bool FileName::removeFile() const
 {
        bool const success = QFile::remove(d->fi.absoluteFilePath());
+       d->refresh();
        if (!success && exists())
                LYXERR0("Could not delete file " << *this);
        return success;