scoped_lock.hpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*=============================================================================
  2. Copyright (c) 2003 Martin Wille
  3. http://spirit.sourceforge.net/
  4. Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. =============================================================================*/
  7. #ifndef BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP
  8. #define BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP
  9. ///////////////////////////////////////////////////////////////////////////////
  10. #include <boost/spirit/home/classic/namespace.hpp>
  11. #include <boost/thread/lock_types.hpp>
  12. #if !defined(BOOST_SPIRIT_COMPOSITE_HPP)
  13. #include <boost/spirit/home/classic/core/composite.hpp>
  14. #endif
  15. ///////////////////////////////////////////////////////////////////////////////
  16. namespace boost { namespace spirit {
  17. BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
  18. ///////////////////////////////////////////////////////////////////////////
  19. //
  20. // scoped_lock_parser class
  21. //
  22. // implements locking of a mutex during execution of
  23. // the parse method of an embedded parser
  24. //
  25. ///////////////////////////////////////////////////////////////////////////
  26. template <typename MutexT, typename ParserT>
  27. struct scoped_lock_parser
  28. : public unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > >
  29. {
  30. typedef scoped_lock_parser<MutexT, ParserT> self_t;
  31. typedef MutexT mutex_t;
  32. typedef ParserT parser_t;
  33. template <typename ScannerT>
  34. struct result
  35. {
  36. typedef typename parser_result<parser_t, ScannerT>::type type;
  37. };
  38. scoped_lock_parser(mutex_t &m, parser_t const &p)
  39. : unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > >(p)
  40. , mutex(m)
  41. {}
  42. template <typename ScannerT>
  43. typename parser_result<self_t, ScannerT>::type
  44. parse(ScannerT const &scan) const
  45. {
  46. typedef boost::unique_lock<mutex_t> scoped_lock_t;
  47. scoped_lock_t lock(mutex);
  48. return this->subject().parse(scan);
  49. }
  50. mutex_t &mutex;
  51. };
  52. ///////////////////////////////////////////////////////////////////////////
  53. //
  54. // scoped_lock_parser_gen
  55. //
  56. // generator for scoped_lock_parser objects
  57. // operator[] returns scoped_lock_parser according to its argument
  58. //
  59. ///////////////////////////////////////////////////////////////////////////
  60. template <typename MutexT>
  61. struct scoped_lock_parser_gen
  62. {
  63. typedef MutexT mutex_t;
  64. explicit scoped_lock_parser_gen(mutex_t &m) : mutex(m) {}
  65. template<typename ParserT>
  66. scoped_lock_parser
  67. <
  68. MutexT,
  69. typename as_parser<ParserT>::type
  70. >
  71. operator[](ParserT const &p) const
  72. {
  73. typedef ::BOOST_SPIRIT_CLASSIC_NS::as_parser<ParserT> as_parser_t;
  74. typedef typename as_parser_t::type parser_t;
  75. return scoped_lock_parser<mutex_t, parser_t>
  76. (mutex, as_parser_t::convert(p));
  77. }
  78. mutex_t &mutex;
  79. };
  80. ///////////////////////////////////////////////////////////////////////////
  81. //
  82. // scoped_lock_d parser directive
  83. //
  84. // constructs a scoped_lock_parser generator from its argument
  85. //
  86. ///////////////////////////////////////////////////////////////////////////
  87. template <typename MutexT>
  88. scoped_lock_parser_gen<MutexT>
  89. scoped_lock_d(MutexT &mutex)
  90. {
  91. return scoped_lock_parser_gen<MutexT>(mutex);
  92. }
  93. BOOST_SPIRIT_CLASSIC_NAMESPACE_END
  94. }} // namespace BOOST_SPIRIT_CLASSIC_NS
  95. #endif // BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP