Re: A few questions about singletons...
"Michael Doubez" <michael.doubez@free.fr> wrote in message
news:c96a9e29-4305-446d-8d88-55693fc8f99c@v36g2000yqv.googlegroups.com...
On 30 sep, 01:48, "Chris M. Thomasson" <n...@spam.invalid> wrote:
[snip]
if (! m_mutex)
{
assert(m_mutex);
std::unexpected();
}
[snip]
I wondered about this usage of assert() + unexpected(): what is the
rational of using both ?
I made several *mistakes in the "hard" error handling code. Sorry about
that.
To tell the truth, I never use std::unexpected(). How and when do you
use it ?
Quite frankly, I personally do not know which exception to throw as I am not
a C++ expert. I decorated the constructor/destructor and `prv_get_name()'
functions with the `throw()' clause. IMVHO, if the ctor of a singleton
fails, then end user program is in peril. Should the singleton ctor throw or
not?
(*)
BTW, here is corrected code:
_______________________________________________________________________
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <sstream>
#include <iostream>
#include <cstdio>
#if ! defined (WIN_DCL_MUTEX_UNEXPECTED)
# include <cassert>
# include <exception>
# define WIN_DCL_MUTEX_UNEXPECTED assert(false), std::unexpected
#endif
class win_dcl_mutex
{
HANDLE m_mutex;
private:
template<typename T>
static std::string prv_get_name(T const& id) throw()
{
std::ostringstream name;
name << "DCL_MUTEX_" << GetCurrentProcessId() << "_" << id;
// std::cout << name.str() << std::endl;
return name.str();
}
public:
template<typename T>
win_dcl_mutex(T const& id) throw()
: m_mutex(CreateMutex(NULL, TRUE, prv_get_name(id).c_str()))
{
if (! m_mutex)
{
WIN_DCL_MUTEX_UNEXPECTED();
}
else if (GetLastError() == ERROR_ALREADY_EXISTS)
{
if (WaitForSingleObject(m_mutex, INFINITE) !=
WAIT_OBJECT_0)
{
CloseHandle(m_mutex);
WIN_DCL_MUTEX_UNEXPECTED();
}
}
}
~win_dcl_mutex() throw()
{
if (! ReleaseMutex(m_mutex))
{
CloseHandle(m_mutex);
WIN_DCL_MUTEX_UNEXPECTED();
}
if (! CloseHandle(m_mutex))
{
WIN_DCL_MUTEX_UNEXPECTED();
}
}
};
int
main()
{
{
win_dcl_mutex mutex(12345);
}
return 0;
}
_______________________________________________________________________