diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2019-08-28 14:28:14 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2019-08-28 15:22:27 +0200 |
commit | 956a2ef78d4fa5da162833f884fe72eba8f6184f (patch) | |
tree | 5eb8fab4d30451be717d99fb208b3627a09924b5 | |
parent | record: Introduce <rtems/recordserver.h> (diff) | |
download | rtems-956a2ef78d4fa5da162833f884fe72eba8f6184f.tar.bz2 |
record: Add variants for critical sections
Update #3665.
-rw-r--r-- | cpukit/include/rtems/record.h | 46 | ||||
-rw-r--r-- | testsuites/libtests/record01/init.c | 7 |
2 files changed, 48 insertions, 5 deletions
diff --git a/cpukit/include/rtems/record.h b/cpukit/include/rtems/record.h index ff1ee22b0d..0446c2ae69 100644 --- a/cpukit/include/rtems/record.h +++ b/cpukit/include/rtems/record.h @@ -172,6 +172,34 @@ void _Record_Stream_header_initialize( Record_Stream_header *header ); */ /** + * @brief Prepares to add and commit record items in a critical section with + * interrupts disabled. + * + * This function does not disable interrupts. It must be called with + * interrupts disabled. Interrupts must be disabled until the corresponding + * rtems_record_commit_critical() was called. + * + * @param context The record context which must be used for the following + * rtems_record_add() and rtems_record_commit_critical() calls. The record + * context may have an arbitrary content at function entry. + * @param cpu_self The control of the current processor. + */ +RTEMS_INLINE_ROUTINE void rtems_record_prepare_critical( + rtems_record_context *context, + const Per_CPU_Control *cpu_self +) +{ + Record_Control *control; + unsigned int head; + + context->now = RTEMS_RECORD_TIME_EVENT( _Record_Now(), 0 ); + control = cpu_self->record; + context->control = control; + head = _Record_Head( control ); + context->head = head; +} + +/** * @brief Prepares to add and commit record items. * * This function disables interrupts. @@ -226,17 +254,29 @@ RTEMS_INLINE_ROUTINE void rtems_record_add( } /** - * @brief Commits a set of record items. + * @brief Commits a set of record items in a critical section with interrupts + * disabled. * - * @param context The record context initialized via rtems_record_prepare(). + * @param context The record context initialized via + * rtems_record_prepare_critical(). */ -RTEMS_INLINE_ROUTINE void rtems_record_commit( rtems_record_context *context ) +RTEMS_INLINE_ROUTINE void rtems_record_commit_critical( rtems_record_context *context ) { _Atomic_Store_uint( &context->control->head, context->head, ATOMIC_ORDER_RELEASE ); +} + +/** + * @brief Commits a set of record items. + * + * @param context The record context initialized via rtems_record_prepare(). + */ +RTEMS_INLINE_ROUTINE void rtems_record_commit( rtems_record_context *context ) +{ + rtems_record_commit_critical( context ); rtems_interrupt_local_enable( context->level ); } diff --git a/testsuites/libtests/record01/init.c b/testsuites/libtests/record01/init.c index e8ff23694d..1789d41f84 100644 --- a/testsuites/libtests/record01/init.c +++ b/testsuites/libtests/record01/init.c @@ -265,10 +265,12 @@ static void test_add_2_items(test_context *ctx, Record_Control *control) static void test_add_3_items(test_context *ctx, Record_Control *control) { rtems_record_context rc; + rtems_interrupt_level level; init_context(ctx); - rtems_record_prepare(&rc); + rtems_interrupt_local_disable(level); + rtems_record_prepare_critical(&rc, _Per_CPU_Get()); rtems_test_assert(rc.control == control); rtems_test_assert(rc.head == 0); rtems_test_assert(_Record_Head(control) == 0); @@ -290,7 +292,8 @@ static void test_add_3_items(test_context *ctx, Record_Control *control) rc.now = RTEMS_RECORD_TIME_EVENT(10, 0); rtems_record_add(&rc, UE(9), 11); - rtems_record_commit(&rc); + rtems_record_commit_critical(&rc); + rtems_interrupt_local_enable(level); rtems_test_assert(rc.head == 3); rtems_test_assert(memcmp(control->Items, expected_items_7, ITEM_SIZE) == 0); rtems_test_assert(_Record_Head(control) == 3); |