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

View File

@ -46,6 +46,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h> // for kill()
#include <errno.h>
#ifdef HAVE_FCNTL
#include <fcntl.h>
@ -57,15 +58,28 @@
#endif // fcntl()/flock()
// ----------------------------------------------------------------------------
// private functions: (exclusively) lock/unlock the file
// constants
// ----------------------------------------------------------------------------
// argument of wxLockFile()
enum LockOperation
{
LOCK,
UNLOCK
};
// return value of CreateLockFile()
enum LockResult
{
LOCK_ERROR = -1,
LOCK_EXISTS,
LOCK_CREATED
};
// ----------------------------------------------------------------------------
// private functions: (exclusively) lock/unlock the file
// ----------------------------------------------------------------------------
#ifdef HAVE_FCNTL
static int wxLockFile(int fd, LockOperation lock)
@ -115,7 +129,7 @@ public:
private:
// try to create and lock the file
bool CreateLockFile();
LockResult CreateLockFile();
// unlock and remove the lock file
void Unlock();
@ -134,7 +148,7 @@ private:
// wxSingleInstanceCheckerImpl implementation
// ============================================================================
bool wxSingleInstanceCheckerImpl::CreateLockFile()
LockResult wxSingleInstanceCheckerImpl::CreateLockFile()
{
// try to open the file
m_fdLock = open(m_nameLock,
@ -144,7 +158,8 @@ bool wxSingleInstanceCheckerImpl::CreateLockFile()
if ( m_fdLock != -1 )
{
// 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
// into it
@ -161,33 +176,55 @@ bool wxSingleInstanceCheckerImpl::CreateLockFile()
Unlock();
return FALSE;
return LOCK_ERROR;
}
fsync(m_fdLock);
return TRUE;
return LOCK_CREATED;
}
else // failure: see what exactly happened
{
close(m_fdLock);
m_fdLock = -1;
// 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);
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
return FALSE;
return LOCK_EXISTS;
}
bool wxSingleInstanceCheckerImpl::Create(const wxString& name)
{
m_nameLock = name;
if ( CreateLockFile() )
switch ( CreateLockFile() )
{
// nothing more to do
return TRUE;
case LOCK_EXISTS:
// there is a lock file, check below if it is still valid
break;
case LOCK_CREATED:
// nothing more to do
return TRUE;
case LOCK_ERROR:
// oops...
return FALSE;
}
// 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
{
wxLogWarning(_("Invalid lock file '%s'."));
wxLogWarning(_("Invalid lock file '%s'."), name.c_str());
}
}