some fixes to wxSingleInstanceChecker error reporting

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10467 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2001-06-09 01:56:00 +00:00
parent 7c4157904f
commit b5299791f4
2 changed files with 68 additions and 24 deletions

View File

@@ -4562,7 +4562,9 @@ int main(int argc, char **argv)
} }
#ifdef TEST_SNGLINST #ifdef TEST_SNGLINST
wxSingleInstanceChecker checker(_T(".wxconsole.lock")); wxSingleInstanceChecker checker;
if ( checker.Create(_T(".wxconsole.lock")) )
{
if ( checker.IsAnotherRunning() ) if ( checker.IsAnotherRunning() )
{ {
wxPrintf(_T("Another instance of the program is running, exiting.\n")); wxPrintf(_T("Another instance of the program is running, exiting.\n"));
@@ -4573,6 +4575,11 @@ int main(int argc, char **argv)
// wait some time to give time to launch another instance // wait some time to give time to launch another instance
wxPrintf(_T("Press \"Enter\" to continue...")); wxPrintf(_T("Press \"Enter\" to continue..."));
wxFgetc(stdin); wxFgetc(stdin);
}
else // failed to create
{
wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
}
#endif // TEST_SNGLINST #endif // TEST_SNGLINST
#ifdef TEST_CHARSET #ifdef TEST_CHARSET

View File

@@ -46,6 +46,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <signal.h> // for kill() #include <signal.h> // for kill()
#include <errno.h>
#ifdef HAVE_FCNTL #ifdef HAVE_FCNTL
#include <fcntl.h> #include <fcntl.h>
@@ -57,15 +58,28 @@
#endif // fcntl()/flock() #endif // fcntl()/flock()
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// private functions: (exclusively) lock/unlock the file // constants
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// argument of wxLockFile()
enum LockOperation enum LockOperation
{ {
LOCK, LOCK,
UNLOCK UNLOCK
}; };
// return value of CreateLockFile()
enum LockResult
{
LOCK_ERROR = -1,
LOCK_EXISTS,
LOCK_CREATED
};
// ----------------------------------------------------------------------------
// private functions: (exclusively) lock/unlock the file
// ----------------------------------------------------------------------------
#ifdef HAVE_FCNTL #ifdef HAVE_FCNTL
static int wxLockFile(int fd, LockOperation lock) static int wxLockFile(int fd, LockOperation lock)
@@ -115,7 +129,7 @@ public:
private: private:
// try to create and lock the file // try to create and lock the file
bool CreateLockFile(); LockResult CreateLockFile();
// unlock and remove the lock file // unlock and remove the lock file
void Unlock(); void Unlock();
@@ -134,7 +148,7 @@ private:
// wxSingleInstanceCheckerImpl implementation // wxSingleInstanceCheckerImpl implementation
// ============================================================================ // ============================================================================
bool wxSingleInstanceCheckerImpl::CreateLockFile() LockResult wxSingleInstanceCheckerImpl::CreateLockFile()
{ {
// try to open the file // try to open the file
m_fdLock = open(m_nameLock, m_fdLock = open(m_nameLock,
@@ -144,7 +158,8 @@ bool wxSingleInstanceCheckerImpl::CreateLockFile()
if ( m_fdLock != -1 ) if ( m_fdLock != -1 )
{ {
// try to lock it // try to lock it
if ( wxLockFile(m_fdLock, LOCK) == 0 ) int rc = wxLockFile(m_fdLock, LOCK);
if ( rc == 0 )
{ {
// fine, we have the exclusive lock to the file, write our PID // fine, we have the exclusive lock to the file, write our PID
// into it // into it
@@ -161,33 +176,55 @@ bool wxSingleInstanceCheckerImpl::CreateLockFile()
Unlock(); Unlock();
return FALSE; return LOCK_ERROR;
} }
fsync(m_fdLock); fsync(m_fdLock);
return TRUE; return LOCK_CREATED;
} }
else // failure: see what exactly happened
// couldn't lock: this might have happened because of a race {
// condition: maybe another instance opened and locked the file
// between our calls to open() and flock()
close(m_fdLock); close(m_fdLock);
m_fdLock = -1; m_fdLock = -1;
if ( rc != EACCES && rc != EAGAIN )
{
wxLogSysError(_("Failed to lock the lock file '%s'"),
m_nameLock.c_str());
unlink(m_nameLock);
return LOCK_ERROR;
}
//else: couldn't lock because the lock is held by another process:
// this might have happened because of a race condition:
// maybe another instance opened and locked the file between
// our calls to open() and flock(), so don't give an error
}
} }
// we didn't create and lock the file // we didn't create and lock the file
return FALSE; return LOCK_EXISTS;
} }
bool wxSingleInstanceCheckerImpl::Create(const wxString& name) bool wxSingleInstanceCheckerImpl::Create(const wxString& name)
{ {
m_nameLock = name; m_nameLock = name;
if ( CreateLockFile() ) switch ( CreateLockFile() )
{ {
case LOCK_EXISTS:
// there is a lock file, check below if it is still valid
break;
case LOCK_CREATED:
// nothing more to do // nothing more to do
return TRUE; return TRUE;
case LOCK_ERROR:
// oops...
return FALSE;
} }
// try to open the file for reading and get the PID of the process // try to open the file for reading and get the PID of the process
@@ -241,7 +278,7 @@ bool wxSingleInstanceCheckerImpl::Create(const wxString& name)
} }
else else
{ {
wxLogWarning(_("Invalid lock file '%s'.")); wxLogWarning(_("Invalid lock file '%s'."), name.c_str());
} }
} }