#pragma once #include #include static inline void termsec_begin_wait( void *wh ) { __lart_termsec_begin( __lart_termsec_kind_user_wait, wh, __dios_this_task() ); } static inline void termsec_end_wait( void *wh ) { __lart_termsec_end( __lart_termsec_kind_user_wait, wh, __dios_this_task() ); } static inline void termsec_begin_exclusive( void *wh ) { __lart_termsec_begin( __lart_termsec_kind_user_excl, wh, 0 ); } static inline void termsec_end_exclusive( void *wh ) { __lart_termsec_end( __lart_termsec_kind_user_excl, wh, 0 ); } typedef struct { struct _VM_Frame *_frame; void *_pc; } TermsecFunctionId; static inline TermsecFunctionId termsec_begin_function() { TermsecFunctionId id; id._frame = __dios_this_frame(); id._pc = (void *)id._frame->pc; __lart_termsec_begin( __lart_termsec_kind_function, id._frame, id._pc ); return id; } static inline void termsec_end_function(TermsecFunctionId id) { __lart_termsec_end( __lart_termsec_kind_function, id._frame, id._pc ); } #ifdef __cplusplus namespace termsec { struct CheckExclusive { CheckExclusive( void *wh ) : _wh( wh ) { termsec_begin_exclusive( _wh ); } ~CheckExclusive() { termsec_end_exclusive( _wh ); } private: void *_wh; }; struct CheckWait { CheckWait( void *wh ) : _wh( wh ) { termsec_begin_wait( _wh ); } ~CheckWait() { termsec_end_wait( _wh ); } private: void *_wh; }; struct CheckFunction { CheckFunction() : _id( termsec_begin_function() ) {} ~CheckFunction() { termsec_end_function( _id ); } private: TermsecFunctionId _id; }; } #endif