Mutex_POSIX.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. //
  2. // Mutex_POSIX.h
  3. //
  4. // $Id: //poco/1.4/Foundation/include/Poco/Mutex_POSIX.h#2 $
  5. //
  6. // Library: Foundation
  7. // Package: Threading
  8. // Module: Mutex
  9. //
  10. // Definition of the MutexImpl and FastMutexImpl classes for POSIX Threads.
  11. //
  12. // Copyright (c) 2004-2008, Applied Informatics Software Engineering GmbH.
  13. // and Contributors.
  14. //
  15. // SPDX-License-Identifier: BSL-1.0
  16. //
  17. #ifndef Foundation_Mutex_POSIX_INCLUDED
  18. #define Foundation_Mutex_POSIX_INCLUDED
  19. #include "Poco/Foundation.h"
  20. #include "Poco/Exception.h"
  21. #include <pthread.h>
  22. #include <errno.h>
  23. namespace Poco {
  24. class Foundation_API MutexImpl
  25. {
  26. protected:
  27. MutexImpl();
  28. MutexImpl(bool fast);
  29. ~MutexImpl();
  30. void lockImpl();
  31. bool tryLockImpl();
  32. bool tryLockImpl(long milliseconds);
  33. void unlockImpl();
  34. private:
  35. pthread_mutex_t _mutex;
  36. };
  37. class Foundation_API FastMutexImpl: public MutexImpl
  38. {
  39. protected:
  40. FastMutexImpl();
  41. ~FastMutexImpl();
  42. };
  43. //
  44. // inlines
  45. //
  46. inline void MutexImpl::lockImpl()
  47. {
  48. if (pthread_mutex_lock(&_mutex))
  49. throw SystemException("cannot lock mutex");
  50. }
  51. inline bool MutexImpl::tryLockImpl()
  52. {
  53. int rc = pthread_mutex_trylock(&_mutex);
  54. if (rc == 0)
  55. return true;
  56. else if (rc == EBUSY)
  57. return false;
  58. else
  59. throw SystemException("cannot lock mutex");
  60. }
  61. inline void MutexImpl::unlockImpl()
  62. {
  63. if (pthread_mutex_unlock(&_mutex))
  64. throw SystemException("cannot unlock mutex");
  65. }
  66. } // namespace Poco
  67. #endif // Foundation_Mutex_POSIX_INCLUDED