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:
@@ -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
|
||||||
|
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user