summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-03-07 16:01:57 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-03-14 09:06:27 +0100
commit77e6eba7146ba2e2074b719eec01cc7c40bbe98b (patch)
treeec87c51ccd9c53cb65067a2a06a75d29b32387f3
parentpc386: Fix linker usage issues with -r and function sections (diff)
downloadrtems-77e6eba7146ba2e2074b719eec01cc7c40bbe98b.tar.bz2
score: Add and use _Objects_Get_local()
This simplifies the handling with local-only objects. Update #2555.
-rw-r--r--cpukit/posix/include/rtems/posix/timerimpl.h4
-rw-r--r--cpukit/posix/src/timerdelete.c36
-rw-r--r--cpukit/posix/src/timergetoverrun.c26
-rw-r--r--cpukit/posix/src/timergettime.c37
-rw-r--r--cpukit/posix/src/timersettime.c78
-rw-r--r--cpukit/rtems/include/rtems/rtems/timerimpl.h4
-rw-r--r--cpukit/rtems/src/timercancel.c26
-rw-r--r--cpukit/rtems/src/timercreate.c72
-rw-r--r--cpukit/rtems/src/timerdelete.c36
-rw-r--r--cpukit/rtems/src/timergetinfo.c39
-rw-r--r--cpukit/rtems/src/timerreset.c74
-rw-r--r--cpukit/score/Makefile.am1
-rw-r--r--cpukit/score/include/rtems/score/objectimpl.h23
-rw-r--r--cpukit/score/src/objectgetlocal.c53
14 files changed, 243 insertions, 266 deletions
diff --git a/cpukit/posix/include/rtems/posix/timerimpl.h b/cpukit/posix/include/rtems/posix/timerimpl.h
index 2eefd7063c..bf25629529 100644
--- a/cpukit/posix/include/rtems/posix/timerimpl.h
+++ b/cpukit/posix/include/rtems/posix/timerimpl.h
@@ -94,14 +94,12 @@ void _POSIX_Timer_TSR( Watchdog_Control *the_watchdog );
*/
RTEMS_INLINE_ROUTINE POSIX_Timer_Control *_POSIX_Timer_Get (
timer_t id,
- Objects_Locations *location,
ISR_lock_Context *lock_context
)
{
- return (POSIX_Timer_Control *) _Objects_Get_isr_disable(
+ return (POSIX_Timer_Control *) _Objects_Get_local(
&_POSIX_Timer_Information,
(Objects_Id) id,
- location,
lock_context
);
}
diff --git a/cpukit/posix/src/timerdelete.c b/cpukit/posix/src/timerdelete.c
index c39de8e168..5301a708c9 100644
--- a/cpukit/posix/src/timerdelete.c
+++ b/cpukit/posix/src/timerdelete.c
@@ -44,33 +44,25 @@ int timer_delete(
* because rtems_timer_delete stops the timer before deleting it.
*/
POSIX_Timer_Control *ptimer;
- Objects_Locations location;
ISR_lock_Context lock_context;
- Per_CPU_Control *cpu;
_Objects_Allocator_lock();
- ptimer = _POSIX_Timer_Get( timerid, &location, &lock_context );
- switch ( location ) {
- case OBJECTS_LOCAL:
- _Objects_Close( &_POSIX_Timer_Information, &ptimer->Object );
- cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
- ptimer->state = POSIX_TIMER_STATE_FREE;
- _Watchdog_Remove(
- &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ],
- &ptimer->Timer
- );
- _POSIX_Timer_Release( cpu, &lock_context );
- _POSIX_Timer_Free( ptimer );
- _Objects_Allocator_unlock();
+ ptimer = _POSIX_Timer_Get( timerid, &lock_context );
+ if ( ptimer != NULL ) {
+ Per_CPU_Control *cpu;
- return 0;
-
-#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE:
-#endif
- case OBJECTS_ERROR:
- break;
+ _Objects_Close( &_POSIX_Timer_Information, &ptimer->Object );
+ cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
+ ptimer->state = POSIX_TIMER_STATE_FREE;
+ _Watchdog_Remove(
+ &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ],
+ &ptimer->Timer
+ );
+ _POSIX_Timer_Release( cpu, &lock_context );
+ _POSIX_Timer_Free( ptimer );
+ _Objects_Allocator_unlock();
+ return 0;
}
_Objects_Allocator_unlock();
diff --git a/cpukit/posix/src/timergetoverrun.c b/cpukit/posix/src/timergetoverrun.c
index 0a28fa7b5f..0a7b9fafa6 100644
--- a/cpukit/posix/src/timergetoverrun.c
+++ b/cpukit/posix/src/timergetoverrun.c
@@ -30,27 +30,19 @@ int timer_getoverrun(
timer_t timerid
)
{
- int overrun;
POSIX_Timer_Control *ptimer;
- Objects_Locations location;
ISR_lock_Context lock_context;
- Per_CPU_Control *cpu;
- ptimer = _POSIX_Timer_Get( timerid, &location, &lock_context );
- switch ( location ) {
+ ptimer = _POSIX_Timer_Get( timerid, &lock_context );
+ if ( ptimer != NULL ) {
+ Per_CPU_Control *cpu;
+ int overrun;
- case OBJECTS_LOCAL:
- cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
- overrun = ptimer->overrun;
- ptimer->overrun = 0;
- _POSIX_Timer_Release( cpu, &lock_context );
- return overrun;
-
-#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE:
-#endif
- case OBJECTS_ERROR:
- break;
+ cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
+ overrun = ptimer->overrun;
+ ptimer->overrun = 0;
+ _POSIX_Timer_Release( cpu, &lock_context );
+ return overrun;
}
rtems_set_errno_and_return_minus_one( EINVAL );
diff --git a/cpukit/posix/src/timergettime.c b/cpukit/posix/src/timergettime.c
index 7f0015bf5e..66708e947b 100644
--- a/cpukit/posix/src/timergettime.c
+++ b/cpukit/posix/src/timergettime.c
@@ -41,40 +41,31 @@ int timer_gettime(
)
{
POSIX_Timer_Control *ptimer;
- Objects_Locations location;
ISR_lock_Context lock_context;
- Per_CPU_Control *cpu;
uint64_t now;
uint32_t remaining;
if ( !value )
rtems_set_errno_and_return_minus_one( EINVAL );
- ptimer = _POSIX_Timer_Get( timerid, &location, &lock_context );
- switch ( location ) {
+ ptimer = _POSIX_Timer_Get( timerid, &lock_context );
+ if ( ptimer != NULL ) {
+ Per_CPU_Control *cpu;
- case OBJECTS_LOCAL:
+ cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
+ now = cpu->Watchdog.ticks;
- cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
- now = cpu->Watchdog.ticks;
+ if ( now < ptimer->Timer.expire ) {
+ remaining = (uint32_t) ( ptimer->Timer.expire - now );
+ } else {
+ remaining = 0;
+ }
- if ( now < ptimer->Timer.expire ) {
- remaining = (uint32_t) ( ptimer->Timer.expire - now );
- } else {
- remaining = 0;
- }
+ _Timespec_From_ticks( remaining, &value->it_value );
+ value->it_interval = ptimer->timer_data.it_interval;
- _Timespec_From_ticks( remaining, &value->it_value );
- value->it_interval = ptimer->timer_data.it_interval;
-
- _POSIX_Timer_Release( cpu, &lock_context );
- return 0;
-
-#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE:
-#endif
- case OBJECTS_ERROR:
- break;
+ _POSIX_Timer_Release( cpu, &lock_context );
+ return 0;
}
rtems_set_errno_and_return_minus_one( EINVAL );
diff --git a/cpukit/posix/src/timersettime.c b/cpukit/posix/src/timersettime.c
index ac5c258eda..51678ca5cb 100644
--- a/cpukit/posix/src/timersettime.c
+++ b/cpukit/posix/src/timersettime.c
@@ -107,9 +107,7 @@ int timer_settime(
)
{
POSIX_Timer_Control *ptimer;
- Objects_Locations location;
ISR_lock_Context lock_context;
- Per_CPU_Control *cpu;
uint32_t initial_period;
struct itimerspec normalize;
@@ -148,53 +146,47 @@ int timer_settime(
* or start it again
*/
- ptimer = _POSIX_Timer_Get( timerid, &location, &lock_context );
- switch ( location ) {
-
- case OBJECTS_LOCAL:
- cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
-
- /* Stop the timer */
- _Watchdog_Remove(
- &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ],
- &ptimer->Timer
- );
-
- /* First, it verifies if the timer must be stopped */
- if ( normalize.it_value.tv_sec == 0 && normalize.it_value.tv_nsec == 0 ) {
- /* The old data of the timer are returned */
- if ( ovalue )
- *ovalue = ptimer->timer_data;
- /* The new data are set */
- ptimer->timer_data = normalize;
- /* Indicates that the timer is created and stopped */
- ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
- /* Returns with success */
- _POSIX_Timer_Release( cpu, &lock_context );
- return 0;
- }
-
- /* Convert from seconds and nanoseconds to ticks */
- ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
- initial_period = _Timespec_To_ticks( &normalize.it_value );
-
- _POSIX_Timer_Insert( ptimer, cpu, initial_period );
-
- /*
- * The timer has been started and is running. So we return the
- * old ones in "ovalue"
- */
+ ptimer = _POSIX_Timer_Get( timerid, &lock_context );
+ if ( ptimer != NULL ) {
+ Per_CPU_Control *cpu;
+
+ cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
+
+ /* Stop the timer */
+ _Watchdog_Remove(
+ &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ],
+ &ptimer->Timer
+ );
+
+ /* First, it verifies if the timer must be stopped */
+ if ( normalize.it_value.tv_sec == 0 && normalize.it_value.tv_nsec == 0 ) {
+ /* The old data of the timer are returned */
if ( ovalue )
*ovalue = ptimer->timer_data;
+ /* The new data are set */
ptimer->timer_data = normalize;
+ /* Indicates that the timer is created and stopped */
+ ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
+ /* Returns with success */
_POSIX_Timer_Release( cpu, &lock_context );
return 0;
+ }
-#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE:
-#endif
- case OBJECTS_ERROR:
- break;
+ /* Convert from seconds and nanoseconds to ticks */
+ ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
+ initial_period = _Timespec_To_ticks( &normalize.it_value );
+
+ _POSIX_Timer_Insert( ptimer, cpu, initial_period );
+
+ /*
+ * The timer has been started and is running. So we return the
+ * old ones in "ovalue"
+ */
+ if ( ovalue )
+ *ovalue = ptimer->timer_data;
+ ptimer->timer_data = normalize;
+ _POSIX_Timer_Release( cpu, &lock_context );
+ return 0;
}
rtems_set_errno_and_return_minus_one( EINVAL );
diff --git a/cpukit/rtems/include/rtems/rtems/timerimpl.h b/cpukit/rtems/include/rtems/rtems/timerimpl.h
index e4b4ca2ec4..40e2b5fe9c 100644
--- a/cpukit/rtems/include/rtems/rtems/timerimpl.h
+++ b/cpukit/rtems/include/rtems/rtems/timerimpl.h
@@ -84,14 +84,12 @@ RTEMS_INLINE_ROUTINE void _Timer_Free (
RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Get(
Objects_Id id,
- Objects_Locations *location,
ISR_lock_Context *lock_context
)
{
- return (Timer_Control *) _Objects_Get_isr_disable(
+ return (Timer_Control *) _Objects_Get_local(
&_Timer_Information,
id,
- location,
lock_context
);
}
diff --git a/cpukit/rtems/src/timercancel.c b/cpukit/rtems/src/timercancel.c
index 5d4343e776..a69f38e72a 100644
--- a/cpukit/rtems/src/timercancel.c
+++ b/cpukit/rtems/src/timercancel.c
@@ -20,25 +20,17 @@ rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
- Timer_Control *the_timer;
- Objects_Locations location;
- ISR_lock_Context lock_context;
- Per_CPU_Control *cpu;
+ Timer_Control *the_timer;
+ ISR_lock_Context lock_context;
- the_timer = _Timer_Get( id, &location, &lock_context );
- switch ( location ) {
+ the_timer = _Timer_Get( id, &lock_context );
+ if ( the_timer != NULL ) {
+ Per_CPU_Control *cpu;
- case OBJECTS_LOCAL:
- cpu = _Timer_Acquire_critical( the_timer, &lock_context );
- _Timer_Cancel( cpu, the_timer );
- _Timer_Release( cpu, &lock_context );
- return RTEMS_SUCCESSFUL;
-
-#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE: /* should never return this */
-#endif
- case OBJECTS_ERROR:
- break;
+ cpu = _Timer_Acquire_critical( the_timer, &lock_context );
+ _Timer_Cancel( cpu, the_timer );
+ _Timer_Release( cpu, &lock_context );
+ return RTEMS_SUCCESSFUL;
}
return RTEMS_INVALID_ID;
diff --git a/cpukit/rtems/src/timercreate.c b/cpukit/rtems/src/timercreate.c
index 80c1356278..fc6d43e6dc 100644
--- a/cpukit/rtems/src/timercreate.c
+++ b/cpukit/rtems/src/timercreate.c
@@ -54,46 +54,38 @@ rtems_status_code _Timer_Fire(
Watchdog_Service_routine_entry adaptor
)
{
- Timer_Control *the_timer;
- Objects_Locations location;
- ISR_lock_Context lock_context;
- Per_CPU_Control *cpu;
-
- the_timer = _Timer_Get( id, &location, &lock_context );
- switch ( location ) {
-
- case OBJECTS_LOCAL:
- cpu = _Timer_Acquire_critical( the_timer, &lock_context );
- _Timer_Cancel( cpu, the_timer );
- _Watchdog_Initialize( &the_timer->Ticker, adaptor );
- the_timer->the_class = the_class;
- the_timer->routine = routine;
- the_timer->user_data = user_data;
- the_timer->initial = interval;
- the_timer->start_time = _Timer_Get_CPU_ticks( cpu );
-
- if ( _Timer_Is_interval_class( the_class ) ) {
- _Watchdog_Insert(
- &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ],
- &the_timer->Ticker,
- cpu->Watchdog.ticks + interval
- );
- } else {
- _Watchdog_Insert(
- &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_ABSOLUTE ],
- &the_timer->Ticker,
- _Watchdog_Ticks_from_seconds( interval )
- );
- }
-
- _Timer_Release( cpu, &lock_context );
- return RTEMS_SUCCESSFUL;
-
-#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE: /* should never return this */
-#endif
- case OBJECTS_ERROR:
- break;
+ Timer_Control *the_timer;
+ ISR_lock_Context lock_context;
+
+ the_timer = _Timer_Get( id, &lock_context );
+ if ( the_timer != NULL ) {
+ Per_CPU_Control *cpu;
+
+ cpu = _Timer_Acquire_critical( the_timer, &lock_context );
+ _Timer_Cancel( cpu, the_timer );
+ _Watchdog_Initialize( &the_timer->Ticker, adaptor );
+ the_timer->the_class = the_class;
+ the_timer->routine = routine;
+ the_timer->user_data = user_data;
+ the_timer->initial = interval;
+ the_timer->start_time = _Timer_Get_CPU_ticks( cpu );
+
+ if ( _Timer_Is_interval_class( the_class ) ) {
+ _Watchdog_Insert(
+ &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ],
+ &the_timer->Ticker,
+ cpu->Watchdog.ticks + interval
+ );
+ } else {
+ _Watchdog_Insert(
+ &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_ABSOLUTE ],
+ &the_timer->Ticker,
+ _Watchdog_Ticks_from_seconds( interval )
+ );
+ }
+
+ _Timer_Release( cpu, &lock_context );
+ return RTEMS_SUCCESSFUL;
}
return RTEMS_INVALID_ID;
diff --git a/cpukit/rtems/src/timerdelete.c b/cpukit/rtems/src/timerdelete.c
index 9c413976c4..8b23c31093 100644
--- a/cpukit/rtems/src/timerdelete.c
+++ b/cpukit/rtems/src/timerdelete.c
@@ -24,32 +24,24 @@ rtems_status_code rtems_timer_delete(
rtems_id id
)
{
- Timer_Control *the_timer;
- Objects_Locations location;
- ISR_lock_Context lock_context;
- Per_CPU_Control *cpu;
+ Timer_Control *the_timer;
+ ISR_lock_Context lock_context;
_Objects_Allocator_lock();
- the_timer = _Timer_Get( id, &location, &lock_context );
- switch ( location ) {
-
- case OBJECTS_LOCAL:
- _Objects_Close( &_Timer_Information, &the_timer->Object );
- cpu = _Timer_Acquire_critical( the_timer, &lock_context );
- _Timer_Cancel( cpu, the_timer );
- _Timer_Release( cpu, &lock_context );
- _Timer_Free( the_timer );
- _Objects_Allocator_unlock();
- return RTEMS_SUCCESSFUL;
-
-#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE: /* should never return this */
-#endif
- case OBJECTS_ERROR:
- break;
+
+ the_timer = _Timer_Get( id, &lock_context );
+ if ( the_timer != NULL ) {
+ Per_CPU_Control *cpu;
+
+ _Objects_Close( &_Timer_Information, &the_timer->Object );
+ cpu = _Timer_Acquire_critical( the_timer, &lock_context );
+ _Timer_Cancel( cpu, the_timer );
+ _Timer_Release( cpu, &lock_context );
+ _Timer_Free( the_timer );
+ _Objects_Allocator_unlock();
+ return RTEMS_SUCCESSFUL;
}
_Objects_Allocator_unlock();
-
return RTEMS_INVALID_ID;
}
diff --git a/cpukit/rtems/src/timergetinfo.c b/cpukit/rtems/src/timergetinfo.c
index a11861c63e..804b0cf3b0 100644
--- a/cpukit/rtems/src/timergetinfo.c
+++ b/cpukit/rtems/src/timergetinfo.c
@@ -18,43 +18,30 @@
#include "config.h"
#endif
-#include <rtems/system.h>
-#include <rtems/rtems/status.h>
-#include <rtems/rtems/support.h>
-#include <rtems/score/thread.h>
#include <rtems/rtems/timerimpl.h>
-#include <rtems/score/watchdog.h>
rtems_status_code rtems_timer_get_information(
rtems_id id,
rtems_timer_information *the_info
)
{
- Timer_Control *the_timer;
- Objects_Locations location;
- ISR_lock_Context lock_context;
- Per_CPU_Control *cpu;
+ Timer_Control *the_timer;
+ ISR_lock_Context lock_context;
if ( !the_info )
return RTEMS_INVALID_ADDRESS;
- the_timer = _Timer_Get( id, &location, &lock_context );
- switch ( location ) {
-
- case OBJECTS_LOCAL:
- cpu = _Timer_Acquire_critical( the_timer, &lock_context );
- the_info->the_class = the_timer->the_class;
- the_info->initial = the_timer->initial;
- the_info->start_time = the_timer->start_time;
- the_info->stop_time = the_timer->stop_time;
- _Timer_Release( cpu, &lock_context );
- return RTEMS_SUCCESSFUL;
-
-#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE: /* should never return this */
-#endif
- case OBJECTS_ERROR:
- break;
+ the_timer = _Timer_Get( id, &lock_context );
+ if ( the_timer != NULL ) {
+ Per_CPU_Control *cpu;
+
+ cpu = _Timer_Acquire_critical( the_timer, &lock_context );
+ the_info->the_class = the_timer->the_class;
+ the_info->initial = the_timer->initial;
+ the_info->start_time = the_timer->start_time;
+ the_info->stop_time = the_timer->stop_time;
+ _Timer_Release( cpu, &lock_context );
+ return RTEMS_SUCCESSFUL;
}
return RTEMS_INVALID_ID;
diff --git a/cpukit/rtems/src/timerreset.c b/cpukit/rtems/src/timerreset.c
index 72c912baa3..a4090152b3 100644
--- a/cpukit/rtems/src/timerreset.c
+++ b/cpukit/rtems/src/timerreset.c
@@ -18,62 +18,36 @@
#include "config.h"
#endif
-#include <rtems/system.h>
-#include <rtems/rtems/status.h>
-#include <rtems/rtems/support.h>
-#include <rtems/score/thread.h>
#include <rtems/rtems/timerimpl.h>
-#include <rtems/score/watchdogimpl.h>
-
-/*
- * rtems_timer_reset
- *
- * This directive allows a thread to reset a timer.
- *
- * Input parameters:
- * id - timer id
- *
- * Output parameters:
- * RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
- */
rtems_status_code rtems_timer_reset(
rtems_id id
)
{
- Timer_Control *the_timer;
- Objects_Locations location;
- ISR_lock_Context lock_context;
- Per_CPU_Control *cpu;
- rtems_status_code status;
-
- the_timer = _Timer_Get( id, &location, &lock_context );
- switch ( location ) {
-
- case OBJECTS_LOCAL:
- cpu = _Timer_Acquire_critical( the_timer, &lock_context );
-
- if ( _Timer_Is_interval_class( the_timer->the_class ) ) {
- _Timer_Cancel( cpu, the_timer );
- _Watchdog_Insert(
- &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ],
- &the_timer->Ticker,
- cpu->Watchdog.ticks + the_timer->initial
- );
- status = RTEMS_SUCCESSFUL;
- } else {
- status = RTEMS_NOT_DEFINED;
- }
-
- _Timer_Release( cpu, &lock_context );
- return status;
-
-#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE: /* should never return this */
-#endif
- case OBJECTS_ERROR:
- break;
+ Timer_Control *the_timer;
+ ISR_lock_Context lock_context;
+
+ the_timer = _Timer_Get( id, &lock_context );
+ if ( the_timer != NULL ) {
+ Per_CPU_Control *cpu;
+ rtems_status_code status;
+
+ cpu = _Timer_Acquire_critical( the_timer, &lock_context );
+
+ if ( _Timer_Is_interval_class( the_timer->the_class ) ) {
+ _Timer_Cancel( cpu, the_timer );
+ _Watchdog_Insert(
+ &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ],
+ &the_timer->Ticker,
+ cpu->Watchdog.ticks + the_timer->initial
+ );
+ status = RTEMS_SUCCESSFUL;
+ } else {
+ status = RTEMS_NOT_DEFINED;
+ }
+
+ _Timer_Release( cpu, &lock_context );
+ return status;
}
return RTEMS_INVALID_ID;
diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
index ea440b384e..af78f15645 100644
--- a/cpukit/score/Makefile.am
+++ b/cpukit/score/Makefile.am
@@ -214,6 +214,7 @@ libscore_a_SOURCES += src/objectallocate.c src/objectclose.c \
src/objectgetinfo.c src/objectgetinfoid.c src/objectapimaximumclass.c \
src/objectnamespaceremove.c \
src/objectactivecount.c
+libscore_a_SOURCES += src/objectgetlocal.c
## SCHEDULER_C_FILES
libscore_a_SOURCES += src/log2table.c
diff --git a/cpukit/score/include/rtems/score/objectimpl.h b/cpukit/score/include/rtems/score/objectimpl.h
index f7bd69aa8e..933e7e93cf 100644
--- a/cpukit/score/include/rtems/score/objectimpl.h
+++ b/cpukit/score/include/rtems/score/objectimpl.h
@@ -559,6 +559,29 @@ Objects_Control *_Objects_Get_isr_disable(
);
/**
+ * @brief Maps the specified object identifier to the associated local object
+ * control block.
+ *
+ * In this function interrupts are disabled during the object lookup. In case
+ * an associated object exists, then interrupts remain disabled, otherwise the
+ * previous interrupt state is restored.
+ *
+ * @param information The object class information block.
+ * @param[in] id The object identifier.
+ * @param[in] lock_context The interrupt lock context.
+ *
+ * @retval NULL No associated object exists.
+ * @retval other The pointer to the associated object control block.
+ * Interrupts are now disabled and must be restored using the specified lock
+ * context via _ISR_lock_ISR_enable() or _ISR_lock_Release_and_ISR_enable().
+ */
+Objects_Control *_Objects_Get_local(
+ const Objects_Information *information,
+ Objects_Id id,
+ ISR_lock_Context *lock_context
+);
+
+/**
* @brief Maps object ids to object control blocks.
*
* This function maps object ids to object control blocks.
diff --git a/cpukit/score/src/objectgetlocal.c b/cpukit/score/src/objectgetlocal.c
new file mode 100644
index 0000000000..8a93a765c9
--- /dev/null
+++ b/cpukit/score/src/objectgetlocal.c
@@ -0,0 +1,53 @@
+/**
+ * @file
+ *
+ * @brief Object Get Local
+ * @ingroup ScoreObject
+ */
+
+/*
+ * Copyright (c) 2016 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * 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 <rtems/score/objectimpl.h>
+
+Objects_Control *_Objects_Get_local(
+ const Objects_Information *information,
+ Objects_Id id,
+ ISR_lock_Context *lock_context
+)
+{
+ uint32_t index;
+
+ index = id - information->minimum_id + 1;
+
+ if ( information->maximum >= index ) {
+ Objects_Control *the_object;
+
+ _ISR_lock_ISR_disable( lock_context );
+
+ the_object = information->local_table[ index ];
+ if ( the_object != NULL ) {
+ /* ISR disabled on behalf of caller */
+ return the_object;
+ }
+
+ _ISR_lock_ISR_enable( lock_context );
+ }
+
+ return NULL;
+}