score: Add scheduler <sys/lock.h> support

This commit is contained in:
Sebastian Huber
2015-07-20 09:05:30 +02:00
parent 40188718f2
commit a1b4af4bba
4 changed files with 93 additions and 0 deletions

View File

@@ -350,6 +350,7 @@ libscore_a_SOURCES += src/profilingisrentryexit.c
libscore_a_SOURCES += src/mutex.c
libscore_a_SOURCES += src/once.c
libscore_a_SOURCES += src/resourceiterate.c
libscore_a_SOURCES += src/sched.c
libscore_a_SOURCES += src/semaphore.c
libscore_a_SOURCES += src/smpbarrierwait.c
libscore_a_SOURCES += src/kern_tc.c

70
cpukit/score/src/sched.c Normal file
View File

@@ -0,0 +1,70 @@
/*
* Copyright (c) 2015 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 <sys/lock.h>
#include <rtems/score/schedulerimpl.h>
#if HAVE_STRUCT__THREAD_QUEUE_QUEUE
int _Sched_Count( void )
{
return (int) _Scheduler_Count;
}
int _Sched_Index( void )
{
Thread_Control *executing = _Thread_Get_executing();
return (int) _Scheduler_Get_index( _Scheduler_Get( executing ) );
}
int _Sched_Name_to_index( const char *name, size_t len )
{
uint32_t name_32 = 0;
size_t i = 0;
while ( i < 4 && i < len ) {
name_32 |= ( (uint32_t) ( (uint8_t) *name ) ) << ( ( 3 - i ) * 8 );
++name;
++i;
}
for ( i = 0 ; i < _Scheduler_Count ; ++i ) {
const Scheduler_Control *scheduler = &_Scheduler_Table[ i ];
if ( scheduler->name == name_32 ) {
return (int) i;
}
}
return -1;
}
int _Sched_Processor_count( int index )
{
size_t i = (size_t) index;
if ( i < _Scheduler_Count ) {
return _Scheduler_Get_processor_count( &_Scheduler_Table[ i ] );
} else {
return 0;
}
}
#endif /* HAVE_STRUCT__THREAD_QUEUE_QUEUE */

View File

@@ -389,6 +389,20 @@ static void test_futex(test_context *ctx)
rtems_test_assert(ctx->eno[b] == 0);
}
static void test_sched(void)
{
rtems_test_assert(_Sched_Index() == 0);
rtems_test_assert(_Sched_Name_to_index("", 0) == -1);
rtems_test_assert(_Sched_Name_to_index("b", 1) == -1);
rtems_test_assert(_Sched_Name_to_index("bl", 2) == -1);
rtems_test_assert(_Sched_Name_to_index("blu", 3) == -1);
rtems_test_assert(_Sched_Name_to_index("blue", 4) == 0);
rtems_test_assert(_Sched_Name_to_index("blueX", 5) == 0);
rtems_test_assert(_Sched_Processor_count(-1) == 0);
rtems_test_assert(_Sched_Processor_count(0) == 1);
rtems_test_assert(_Sched_Processor_count(1) == 0);
}
static void mid_task(rtems_task_argument arg)
{
rtems_test_assert(0);
@@ -532,6 +546,7 @@ static void test(void)
test_sem(ctx);
test_sem_prio_wait_order(ctx);
test_futex(ctx);
test_sched();
send_event(ctx, 0, EVENT_MTX_DEADLOCK);
@@ -567,6 +582,8 @@ static void Init(rtems_task_argument arg)
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_SCHEDULER_NAME rtems_build_name('b', 'l', 'u', 'e')
#define CONFIGURE_INIT
#include <rtems/confdefs.h>

View File

@@ -22,9 +22,14 @@ directives:
- _Futex_Wait()
- _Futex_Wake()
- _Futex_Destroy()
- _Sched_Count()
- _Sched_Index()
- _Sched_Name_to_index()
- _Sched_Processor_count()
concepts:
- Ensure that self-contained mutexes and recursive mutexes work.
- Ensure that self-contained semaphores work.
- Ensure that self-contained futexes work.
- Ensure that <sys/lock.h> scheduler support works.