scoped_lock.hpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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/spirit/home/classic/core/composite/composite.hpp>
  12. #include <boost/thread/lock_types.hpp>
  13. ///////////////////////////////////////////////////////////////////////////////
  14. namespace boost { namespace spirit {
  15. BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
  16. ///////////////////////////////////////////////////////////////////////////
  17. //
  18. // scoped_lock_parser class
  19. //
  20. // implements locking of a mutex during execution of
  21. // the parse method of an embedded parser
  22. //
  23. ///////////////////////////////////////////////////////////////////////////
  24. template <typename MutexT, typename ParserT>
  25. struct scoped_lock_parser
  26. : public unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > >
  27. {
  28. typedef scoped_lock_parser<MutexT, ParserT> self_t;
  29. typedef MutexT mutex_t;
  30. typedef ParserT parser_t;
  31. template <typename ScannerT>
  32. struct result
  33. {
  34. typedef typename parser_result<parser_t, ScannerT>::type type;
  35. };
  36. scoped_lock_parser(mutex_t &m, parser_t const &p)
  37. : unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > >(p)
  38. , mutex(m)
  39. {}
  40. template <typename ScannerT>
  41. typename parser_result<self_t, ScannerT>::type
  42. parse(ScannerT const &scan) const
  43. {
  44. typedef boost::unique_lock<mutex_t> scoped_lock_t;
  45. scoped_lock_t lock(mutex);
  46. return this->subject().parse(scan);
  47. }
  48. mutex_t &mutex;
  49. };
  50. ///////////////////////////////////////////////////////////////////////////
  51. //
  52. // scoped_lock_parser_gen
  53. //
  54. // generator for scoped_lock_parser objects
  55. // operator[] returns scoped_lock_parser according to its argument
  56. //
  57. ///////////////////////////////////////////////////////////////////////////
  58. template <typename MutexT>
  59. struct scoped_lock_parser_gen
  60. {
  61. typedef MutexT mutex_t;
  62. explicit scoped_lock_parser_gen(mutex_t &m) : mutex(m) {}
  63. template<typename ParserT>
  64. scoped_lock_parser
  65. <
  66. MutexT,
  67. typename as_parser<ParserT>::type
  68. >
  69. operator[](ParserT const &p) const
  70. {
  71. typedef ::BOOST_SPIRIT_CLASSIC_NS::as_parser<ParserT> as_parser_t;
  72. typedef typename as_parser_t::type parser_t;
  73. return scoped_lock_parser<mutex_t, parser_t>
  74. (mutex, as_parser_t::convert(p));
  75. }
  76. mutex_t &mutex;
  77. };
  78. ///////////////////////////////////////////////////////////////////////////
  79. //
  80. // scoped_lock_d parser directive
  81. //
  82. // constructs a scoped_lock_parser generator from its argument
  83. //
  84. ///////////////////////////////////////////////////////////////////////////
  85. template <typename MutexT>
  86. scoped_lock_parser_gen<MutexT>
  87. scoped_lock_d(MutexT &mutex)
  88. {
  89. return scoped_lock_parser_gen<MutexT>(mutex);
  90. }
  91. BOOST_SPIRIT_CLASSIC_NAMESPACE_END
  92. }} // namespace BOOST_SPIRIT_CLASSIC_NS
  93. #endif // BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP