dolphin/Externals/wxWidgets/src/msw/snglinst.cpp
hrydgard 775dc8a9c0 Initial megacommit.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4 8ced0084-cf51-0410-be5f-012b33b47a6e
2008-07-12 17:40:22 +00:00

130 lines
3.7 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: msw/snglinst.cpp
// Purpose: implements wxSingleInstanceChecker class for Win32 using
// named mutexes
// Author: Vadim Zeitlin
// Modified by:
// Created: 08.06.01
// RCS-ID: $Id: snglinst.cpp 35650 2005-09-23 12:56:45Z MR $
// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
// License: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_SNGLINST_CHECKER && defined(__WIN32__)
#ifndef WX_PRECOMP
#include "wx/string.h"
#include "wx/log.h"
#endif //WX_PRECOMP
#include "wx/snglinst.h"
#include "wx/msw/private.h"
// ----------------------------------------------------------------------------
// wxSingleInstanceCheckerImpl: the real implementation class
// ----------------------------------------------------------------------------
class WXDLLEXPORT wxSingleInstanceCheckerImpl
{
public:
wxSingleInstanceCheckerImpl()
{
// we don't care about m_wasOpened, it can't be accessed before being
// initialized
m_hMutex = NULL;
}
bool Create(const wxString& name)
{
m_hMutex = ::CreateMutex(NULL, FALSE, name);
if ( !m_hMutex )
{
wxLogLastError(_T("CreateMutex"));
return false;
}
// mutex was either created or opened - see what really happened
m_wasOpened = ::GetLastError() == ERROR_ALREADY_EXISTS;
return true;
}
bool WasOpened() const
{
wxCHECK_MSG( m_hMutex, false,
_T("can't be called if mutex creation failed") );
return m_wasOpened;
}
~wxSingleInstanceCheckerImpl()
{
if ( m_hMutex )
{
if ( !::CloseHandle(m_hMutex) )
{
wxLogLastError(_T("CloseHandle(mutex)"));
}
}
}
private:
// the result of the CreateMutex() call
bool m_wasOpened;
// the mutex handle, may be NULL
HANDLE m_hMutex;
DECLARE_NO_COPY_CLASS(wxSingleInstanceCheckerImpl)
};
// ============================================================================
// wxSingleInstanceChecker implementation
// ============================================================================
bool wxSingleInstanceChecker::Create(const wxString& name,
const wxString& WXUNUSED(path))
{
wxASSERT_MSG( !m_impl,
_T("calling wxSingleInstanceChecker::Create() twice?") );
// creating unnamed mutex doesn't have the same semantics!
wxASSERT_MSG( !name.empty(), _T("mutex name can't be empty") );
m_impl = new wxSingleInstanceCheckerImpl;
return m_impl->Create(name);
}
bool wxSingleInstanceChecker::IsAnotherRunning() const
{
wxCHECK_MSG( m_impl, false, _T("must call Create() first") );
// if the mutex had been opened, another instance is running - otherwise we
// would have created it
return m_impl->WasOpened();
}
wxSingleInstanceChecker::~wxSingleInstanceChecker()
{
delete m_impl;
}
#endif // wxUSE_SNGLINST_CHECKER