NamedMutex_WIN32U.cpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //
  2. // NamedMutex_WIN32.cpp
  3. //
  4. // $Id: //poco/1.4/Foundation/src/NamedMutex_WIN32U.cpp#1 $
  5. //
  6. // Library: Foundation
  7. // Package: Processes
  8. // Module: NamedMutex
  9. //
  10. // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
  11. // and Contributors.
  12. //
  13. // SPDX-License-Identifier: BSL-1.0
  14. //
  15. #include "Poco/NamedMutex_WIN32U.h"
  16. #include "Poco/Exception.h"
  17. #include "Poco/UnicodeConverter.h"
  18. namespace Poco {
  19. NamedMutexImpl::NamedMutexImpl(const std::string& name):
  20. _name(name)
  21. {
  22. UnicodeConverter::toUTF16(_name, _uname);
  23. _mutex = CreateMutexW(NULL, FALSE, _uname.c_str());
  24. if (!_mutex)
  25. throw SystemException("cannot create named mutex", _name);
  26. }
  27. NamedMutexImpl::~NamedMutexImpl()
  28. {
  29. CloseHandle(_mutex);
  30. }
  31. void NamedMutexImpl::lockImpl()
  32. {
  33. switch (WaitForSingleObject(_mutex, INFINITE))
  34. {
  35. case WAIT_OBJECT_0:
  36. return;
  37. case WAIT_ABANDONED:
  38. throw SystemException("cannot lock named mutex (abadoned)", _name);
  39. default:
  40. throw SystemException("cannot lock named mutex", _name);
  41. }
  42. }
  43. bool NamedMutexImpl::tryLockImpl()
  44. {
  45. switch (WaitForSingleObject(_mutex, 0))
  46. {
  47. case WAIT_OBJECT_0:
  48. return true;
  49. case WAIT_TIMEOUT:
  50. return false;
  51. case WAIT_ABANDONED:
  52. throw SystemException("cannot lock named mutex (abadoned)", _name);
  53. default:
  54. throw SystemException("cannot lock named mutex", _name);
  55. }
  56. }
  57. void NamedMutexImpl::unlockImpl()
  58. {
  59. ReleaseMutex(_mutex);
  60. }
  61. } // namespace Poco