From 43e1573c1f02194a4fa754dfbff51862130742a5 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Sat, 28 Feb 2015 18:06:37 +0100 Subject: score: Add ISR lock to Objects_Control This enables per-object SMP locks on SMP configurations and is the first step to support fine-grained locking. On uni-processor configuration there will be no overhead. The _Objects_Acquire() is intended to replace _Objects_Get_isr_disable(). Update #2273. --- cpukit/score/src/objectacquire.c | 80 ++++++++++++++++++++++++++++++++++++++++ cpukit/score/src/objectclose.c | 2 + 2 files changed, 82 insertions(+) create mode 100644 cpukit/score/src/objectacquire.c (limited to 'cpukit/score/src') diff --git a/cpukit/score/src/objectacquire.c b/cpukit/score/src/objectacquire.c new file mode 100644 index 0000000000..57d38f47bd --- /dev/null +++ b/cpukit/score/src/objectacquire.c @@ -0,0 +1,80 @@ +/** + * @file + * + * @brief Object Acquire + * + * @ingroup ScoreObject + */ + +/* + * Copyright (c) 2015 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#if HAVE_CONFIG_H + #include "config.h" +#endif + +#include + +Objects_Control *_Objects_Acquire( + const Objects_Information *information, + Objects_Id id, + Objects_Locations *location, + ISR_lock_Context *lock_context +) +{ + Objects_Control *the_object; + uint32_t index; + + index = id - information->minimum_id + 1; + + if ( information->maximum >= index ) { + /* + * On uni-processor configurations we disable interrupts before we use the + * local table. This prevents use of freed memory in case the object + * information is extended in between. On SMP configurations bad things + * can happen, see https://devel.rtems.org/ticket/2280. + */ +#if !defined(RTEMS_SMP) + ISR_Level level; + + _ISR_Disable( level ); +#endif + if ( ( the_object = information->local_table[ index ] ) != NULL ) { + *location = OBJECTS_LOCAL; +#if defined(RTEMS_SMP) + _ISR_lock_ISR_disable_and_acquire( &the_object->Lock, lock_context ); +#else + lock_context->isr_level = level; +#endif + + return the_object; + } +#if !defined(RTEMS_SMP) + _ISR_Enable( level ); +#endif + *location = OBJECTS_ERROR; + + return NULL; + } + + *location = OBJECTS_ERROR; + +#if defined(RTEMS_MULTIPROCESSING) + _Objects_MP_Is_remote( information, id, location, &the_object ); + + return the_object; +#else + return NULL; +#endif +} diff --git a/cpukit/score/src/objectclose.c b/cpukit/score/src/objectclose.c index 52eb10c60b..25c7aa1a36 100644 --- a/cpukit/score/src/objectclose.c +++ b/cpukit/score/src/objectclose.c @@ -28,4 +28,6 @@ void _Objects_Close( _Objects_Invalidate_Id( information, the_object ); _Objects_Namespace_remove( information, the_object ); + + _ISR_lock_Destroy( &the_object->Lock ); } -- cgit v1.2.3