///////////////////////////////////////////////////////////////////////////////
-// Name: unix/snglinst.cpp
+// Name: src/unix/snglinst.cpp
// Purpose: implements wxSingleInstanceChecker class for Unix using
// lock files with fcntl(2) or flock(2)
// Author: Vadim Zeitlin
// headers
// ----------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "snglinst.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#include "wx/string.h"
#include "wx/log.h"
#include "wx/intl.h"
+ #include "wx/utils.h" // wxGetHomeDir()
#endif //WX_PRECOMP
#include "wx/file.h"
-#include "wx/utils.h" // wxGetHomeDir()
#include "wx/snglinst.h"
fl.l_type = lock == LOCK ? F_WRLCK : F_UNLCK;
// lock the entire file
- fl.l_whence =
fl.l_start =
- fl.l_len = 0;
+ fl.l_len =
+ fl.l_whence = 0;
// is this needed?
fl.l_pid = getpid();
m_nameLock.c_str());
Unlock();
-
+
return LOCK_ERROR;
}
case LOCK_CREATED:
// nothing more to do
- return TRUE;
+ return true;
case LOCK_ERROR:
// oops...
- return FALSE;
+ return false;
}
// Check if the file is owned by current user and has 0600 permissions.
// rarely in practice that we don't care
wxLogError(_("Failed to access lock file."));
- return FALSE;
+ return false;
}
char buf[256];
wxLogError(_("Failed to remove stale lock file '%s'."),
name.c_str());
- // return TRUE in this case for now...
+ // return true in this case for now...
}
else
{
}
}
- // return TRUE if we could get the PID of the process owning the lock file
+ // return true if we could get the PID of the process owning the lock file
// (whether it is still running or not), FALSE otherwise as it is
// unexpected
return m_pidLocker != 0;
const wxString& path)
{
wxASSERT_MSG( !m_impl,
- _T("calling wxSingleInstanceChecker::Create() twice?") );
+ wxT("calling wxSingleInstanceChecker::Create() twice?") );
// must have the file name to create a lock file
- wxASSERT_MSG( !name.empty(), _T("lock file name can't be empty") );
+ wxASSERT_MSG( !name.empty(), wxT("lock file name can't be empty") );
m_impl = new wxSingleInstanceCheckerImpl;
fullname = wxGetHomeDir();
}
- if ( fullname.Last() != _T('/') )
+ if ( fullname.Last() != wxT('/') )
{
- fullname += _T('/');
+ fullname += wxT('/');
}
fullname << name;
bool wxSingleInstanceChecker::IsAnotherRunning() const
{
- wxCHECK_MSG( m_impl, FALSE, _T("must call Create() first") );
+ wxCHECK_MSG( m_impl, false, wxT("must call Create() first") );
+
+ const pid_t lockerPid = m_impl->GetLockerPID();
+
+ if ( !lockerPid )
+ {
+ // we failed to open the lock file, return false as we're definitely
+ // not sure that another our process is running and so it's better not
+ // to prevent this one from starting up
+ return false;
+ }
// if another instance is running, it must own the lock file - otherwise
// we have it and the locker PID is ours one
- return m_impl->GetLockerPID() != getpid();
+ return lockerPid != getpid();
}
wxSingleInstanceChecker::~wxSingleInstanceChecker()
}
#endif // wxUSE_SNGLINST_CHECKER
-