]> git.saurik.com Git - wxWidgets.git/blame - src/os2/snglinst.cpp
Deallocate wxThreadSpecificInfo when wxThread ends.
[wxWidgets.git] / src / os2 / snglinst.cpp
CommitLineData
b0f73b67 1///////////////////////////////////////////////////////////////////////////////
80fdcdb9 2// Name: src/os2/snglinst.cpp
b0f73b67
VZ
3// Purpose: implements wxSingleInstanceChecker class for OS/2 using
4// named mutexes
5// Author: Vadim Zeitlin
6// Modified by: Lauri Nurmi (modified for OS/2)
526954c5 7// Created: 08.02.2009
526954c5
VZ
8// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9// Licence: wxWindows licence
10///////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
b0f73b67
VZ
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
27#if wxUSE_SNGLINST_CHECKER
28
29#ifndef WX_PRECOMP
30 #include "wx/string.h"
31 #include "wx/log.h"
32#endif //WX_PRECOMP
33
34#include "wx/snglinst.h"
35
36#define INCL_DOSSEMAPHORES
37#define INCL_DOSERRORS
38#include <os2.h>
39
40#include "wx/os2/private.h"
41
42// ----------------------------------------------------------------------------
43// wxSingleInstanceCheckerImpl: the real implementation class
44// ----------------------------------------------------------------------------
45
46class WXDLLEXPORT wxSingleInstanceCheckerImpl
47{
48public:
49 wxSingleInstanceCheckerImpl()
50 {
51 m_hMutex = NULL;
52 m_anotherRunning = false;
53 }
54
55 bool Create(const wxString& name)
56 {
57 wxString semName;
58 semName.Printf(wxT("\\SEM32\\%s"), name.c_str());
59 int rc = DosCreateMutexSem(semName.c_str(), &m_hMutex, DC_SEM_SHARED, 1);
60
61 if ( rc == NO_ERROR ) {
62 m_anotherRunning = false;
63 return true;
64 } else if ( rc == ERROR_DUPLICATE_NAME ) {
65 m_anotherRunning = true;
66 return true;
67 } else {
68 m_anotherRunning = false; // we don't know for sure in this case
69 wxLogLastError(wxT("DosCreateMutexSem"));
70 return false;
71 }
72 }
73
74 bool IsAnotherRunning() const
75 {
76 return m_anotherRunning;
77 }
78
79 ~wxSingleInstanceCheckerImpl()
80 {
81 if ( m_hMutex )
82 {
83 if ( !::DosCloseMutexSem(m_hMutex) )
84 {
85 wxLogLastError(wxT("DosCloseMutexSem"));
86 }
87 }
88 }
89
90private:
91 // if true, creating the mutex either succeeded
92 // or we know it failed because another app is running.
93 bool m_anotherRunning;
94
95 // the mutex handle, may be NULL
96 HMTX m_hMutex;
97
98 DECLARE_NO_COPY_CLASS(wxSingleInstanceCheckerImpl)
99};
100
101// ============================================================================
102// wxSingleInstanceChecker implementation
103// ============================================================================
104
105bool wxSingleInstanceChecker::Create(const wxString& name,
106 const wxString& WXUNUSED(path))
107{
108 wxASSERT_MSG( !m_impl,
109 wxT("calling wxSingleInstanceChecker::Create() twice?") );
110
111 // creating unnamed mutex doesn't have the same semantics!
112 wxASSERT_MSG( !name.empty(), wxT("mutex name can't be empty") );
113
114 m_impl = new wxSingleInstanceCheckerImpl;
115
116 return m_impl->Create(name);
117}
118
956b3d92 119bool wxSingleInstanceChecker::DoIsAnotherRunning() const
b0f73b67
VZ
120{
121 wxCHECK_MSG( m_impl, false, wxT("must call Create() first") );
122
123 return m_impl->IsAnotherRunning();
124}
125
126wxSingleInstanceChecker::~wxSingleInstanceChecker()
127{
128 delete m_impl;
129}
130
131#endif // wxUSE_SNGLINST_CHECKER