Monero
reg_exp_definer.h
Go to the documentation of this file.
1 // Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above copyright
9 // notice, this list of conditions and the following disclaimer in the
10 // documentation and/or other materials provided with the distribution.
11 // * Neither the name of the Andrey N. Sabelnikov nor the
12 // names of its contributors may be used to endorse or promote products
13 // derived from this software without specific prior written permission.
14 //
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
19 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 //
26 
27 
28 #ifndef _REG_EXP_DEFINER_H_
29 #define _REG_EXP_DEFINER_H_
30 
31 #include <atomic>
32 #include <boost/regex.hpp>
33 #include "syncobj.h"
34 
35 namespace epee
36 {
38  {
39  private:
41  public:
44  };
45 
47 
48 #define STATIC_REGEXP_EXPR_1(var_name, xpr_text, reg_exp_flags) \
49  static std::atomic<bool> regexp_initialized_1(false);\
50  volatile uint32_t local_is_initialized_1 = regexp_initialized_1;\
51  if(!local_is_initialized_1)\
52  gregexplock.get_lock().lock();\
53  static const boost::regex var_name(xpr_text , reg_exp_flags);\
54  if(!local_is_initialized_1)\
55 {\
56  regexp_initialized_1 = true;\
57  gregexplock.get_lock().unlock();\
58 }
59 
60 #define STATIC_REGEXP_EXPR_2(var_name, xpr_text, reg_exp_flags) \
61  static std::atomic<bool> regexp_initialized_2(false);\
62  volatile uint32_t local_is_initialized_2 = regexp_initialized_2;\
63  if(!local_is_initialized_2)\
64  gregexplock.get_lock().lock().lock();\
65  static const boost::regex var_name(xpr_text , reg_exp_flags);\
66  if(!local_is_initialized_2)\
67 {\
68  regexp_initialized_2 = true;\
69  gregexplock.get_lock().lock().unlock();\
70 }
71 
72 #define STATIC_REGEXP_EXPR_3(var_name, xpr_text, reg_exp_flags) \
73  static std::atomic<bool> regexp_initialized_3(false);\
74  volatile uint32_t local_is_initialized_3 = regexp_initialized_3;\
75  if(!local_is_initialized_3)\
76  gregexplock.get_lock().lock().lock();\
77  static const boost::regex var_name(xpr_text , reg_exp_flags);\
78  if(!local_is_initialized_3)\
79 {\
80  regexp_initialized_3 = true;\
81  gregexplock.get_lock().lock().unlock();\
82 }
83 }
84 
85 #endif //_REG_EXP_DEFINER_H_
static const global_regexp_critical_section gregexplock
Definition: reg_exp_definer.h:46
Definition: reg_exp_definer.h:37
critical_section & get_lock() const
Definition: reg_exp_definer.h:43
Definition: syncobj.h:81
global_regexp_critical_section()
Definition: reg_exp_definer.h:42
critical_section regexp_lock
Definition: reg_exp_definer.h:40
TODO: (mj-xmr) This will be reduced in an another PR.
Definition: byte_slice.h:39