MEL
Microthread & Execution library
synchronization_macros.h
Go to the documentation of this file.
1 #pragma once
7 #include <mpl/LinkArgs.h>
8 #include <preprocessor/params.h>
9 using mel::mpl::linkFunctor;
10 
11 #include <mpl/ReturnAdaptor.h>
12 #include <tasking/Runnable.h>
13 #include <tasking/utilities.h>
15 namespace mel
16 {
17  namespace core
18  {
19 #define GET_ARG_1( _1, ... ) _1
20 #define GET_ARG_2( _1, _2, ... ) _2
21 #define GET_ARG_3( _1, _2, _3, ... ) _3
22 #define GET_ARG_4( _1, _2, _3, _4, ... ) _4
23 #define GET_ARG_5( _1, _2, _3, _4, _5, ... ) _5
24 #define GET_ARG_6( _1, _2, _3, _4, _5, _6, ... ) _6
25 #define GET_ARG_7( _1, _2, _3, _4, _5, _6, _7, ... ) _7
26 #define GET_ARG_8( _1, _2, _3, _4, _5, _6, _7, _8, ... ) _8
27 #define GET_ARG_9( _1, _2, _3, _4, _5, _6, _7, _8, _9, ... ) _9
28 #define GET_ARG_10( _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, ... ) _10
29 
30 #define CREATE_LINKER( TRet, function_name, args ) \
31  CREATE_LINKER_IMPL( MACRO_NUM_ARGS args, TRet, function_name, args )
32 #define CREATE_LINKER_IMPL( N, TRet, function_name, args ) \
33  CREATE_LINKER_IMPL_( N, TRet, function_name, args )
34 #define CREATE_LINKER_IMPL_( N, TRet, function_name, args ) \
35  CREATE_LINKER_N( N, TRet, function_name, args )
36 //#define CREATE_LINKER_N( N,TRet,function_name,args) CREATE_LINKER_ ## N(
37 // TRet,function_name, args )
38 #define CREATE_LINKER_N( N, TRet, function_name, args ) \
39  CREATE_LINKER_N_( N, TRet, function_name, args )
40 #define CREATE_LINKER_N_( N, TRet, function_name, args ) \
41  CREATE_LINKER_##N( TRet, function_name, args )
42 #define CREATE_LINKER_0( TRet, function_name, args ) function_name
43 #define CREATE_LINKER_1( TRet, function_name, args ) \
44  linkFunctor<TRet, TYPELIST(), GET_ARG_1 args>( function_name, _1 )
45 
46 #define CREATE_LINKER_2( TRet, function_name, args ) \
47  linkFunctor<TRet, TYPELIST(), GET_ARG_1 args, GET_ARG_2 args>( \
48  function_name, _1, _2 )
49 #define CREATE_LINKER_3( TRet, function_name, args ) \
50  linkFunctor<TRet, TYPELIST(), GET_ARG_1 args, GET_ARG_2 args, \
51  GET_ARG_3 args>( function_name, _1, _2, _3 )
52 #define CREATE_LINKER_4( TRet, function_name, args ) \
53  linkFunctor<TRet, TYPELIST(), GET_ARG_1 args, GET_ARG_2 args, \
54  GET_ARG_3 args, GET_ARG_4 args>( function_name, _1, _2, _3, \
55  _4 )
56 #define CREATE_LINKER_5( TRet, function_name, args ) \
57  linkFunctor<TRet, TYPELIST(), GET_ARG_1 args, GET_ARG_2 args, \
58  GET_ARG_3 args, GET_ARG_4 args, GET_ARG_5 args>( \
59  function_name, _1, _2, _3, _4, _5 )
60 
61 #define CREATE_LINKER_6( TRet, function_name, args ) \
62  linkFunctor<TRet, TYPELIST(), GET_ARG_1 args, GET_ARG_2 args, \
63  GET_ARG_3 args, GET_ARG_4 args, GET_ARG_5 args, \
64  GET_ARG_6 args>( function_name, _1, _2, _3, _4, _5, _6 )
65 #define CREATE_LINKER_7( TRet, function_name, args ) \
66  linkFunctor<TRet, TYPELIST(), GET_ARG_1 args, GET_ARG_2 args, \
67  GET_ARG_3 args, GET_ARG_4 args, GET_ARG_5 args, \
68  GET_ARG_6 args, GET_ARG_7 args>( function_name, _1, _2, _3, \
69  _4, _5, _6, _7 )
70 
71  /*
72  old mpl functions/classes haven't any noexcept considerations (not
73  existed at all in C++98), so changed in favor of a labmda based
74  mechanism
75  #define SYNCHRONIZED_STATIC( TRet,
76  function_name,args,runnable,qualifiers) \
77  static TRet function_name##_sync args qualifiers; \
78  static Future<TRet> function_name( MAKE_PARAMS args )
79  qualifiers{ \ return runnable->execute<TRet>( CREATE_LINKER(
80  TRet,function_name##_sync,args ) );}
81  #define SYNCHRONIZED_METHOD( TRet,
82  function_name,args,runnable,qualifiers) \
83  TRet function_name##_sync args qualifiers; \
84  Future<TRet> function_name( MAKE_PARAMS args )
85  qualifiers{ \ return runnable->execute<TRet>( CREATE_LINKER(
86  TRet,makeMemberEncapsulate(
87  &std::remove_reference_t<decltype(*this)>::function_name##_sync,this),args
88  ) );}
89  */
91 
113 #define SYNCHRONIZED_STATIC( function_name, TRet, args, qualifiers, runnable ) \
114  static TRet function_name##_sync args qualifiers; \
115  static Future<TRet> function_name( MAKE_PARAMS args ) qualifiers \
116  { \
117  return runnable->execute<TRet>( \
118  [CALL_PARAMS args]() qualifiers \
119  { return function_name##_sync( CALL_PARAMS args ); } ); \
120  }
143 #define SYNCHRONIZED_METHOD( function_name, TRet, args, qualifiers, runnable ) \
144  TRet function_name##_sync args qualifiers; \
145  Future<TRet> function_name( MAKE_PARAMS args ) qualifiers \
146  { \
147  return runnable->execute<TRet>( \
148  [this, CALL_PARAMS args]() qualifiers \
149  { return function_name##_sync( CALL_PARAMS args ); } ); \
150  }
152  } // namespace core
153 } // namespace mel
154  ///@endcond
A class representing a "running" task, with added functionality to post events requesting execution o...
Definition: Runnable.h:183
Definition: Callback_Impl.h:11
Utilities on tasking, because lack of a better place...Some funcions are intended to be put in a cust...