score: Add scheduler node implementation header

Update #2556.
This commit is contained in:
Sebastian Huber
2016-09-08 09:55:27 +02:00
parent 15b5678dcd
commit 52a661e8f8
6 changed files with 140 additions and 106 deletions
+1
View File
@@ -73,6 +73,7 @@ include_rtems_score_HEADERS += include/rtems/score/schedulercbsimpl.h
include_rtems_score_HEADERS += include/rtems/score/scheduleredf.h
include_rtems_score_HEADERS += include/rtems/score/scheduleredfimpl.h
include_rtems_score_HEADERS += include/rtems/score/schedulernode.h
include_rtems_score_HEADERS += include/rtems/score/schedulernodeimpl.h
include_rtems_score_HEADERS += include/rtems/score/schedulerpriority.h
include_rtems_score_HEADERS += include/rtems/score/schedulerpriorityimpl.h
include_rtems_score_HEADERS += include/rtems/score/schedulerprioritysmp.h
@@ -110,15 +110,6 @@ RTEMS_INLINE_ROUTINE Scheduler_Node *_Scheduler_Thread_get_own_node(
#endif
}
#if defined(RTEMS_SMP)
RTEMS_INLINE_ROUTINE Thread_Control *_Scheduler_Node_get_user(
const Scheduler_Node *node
)
{
return node->user;
}
#endif
ISR_LOCK_DECLARE( extern, _Scheduler_Lock )
/**
@@ -779,82 +770,6 @@ RTEMS_INLINE_ROUTINE Scheduler_Node *_Scheduler_Thread_get_node(
return the_thread->Scheduler.node;
}
RTEMS_INLINE_ROUTINE void _Scheduler_Node_do_initialize(
Scheduler_Node *node,
Thread_Control *the_thread,
Priority_Control priority
)
{
node->owner = the_thread;
node->Priority.value = priority;
node->Priority.prepend_it = false;
#if defined(RTEMS_SMP)
node->user = the_thread;
node->help_state = SCHEDULER_HELP_YOURSELF;
node->idle = NULL;
node->accepts_help = the_thread;
_SMP_sequence_lock_Initialize( &node->Priority.Lock );
#else
(void) the_thread;
#endif
}
RTEMS_INLINE_ROUTINE Thread_Control *_Scheduler_Node_get_owner(
const Scheduler_Node *node
)
{
return node->owner;
}
RTEMS_INLINE_ROUTINE Priority_Control _Scheduler_Node_get_priority(
Scheduler_Node *node,
bool *prepend_it_p
)
{
Priority_Control priority;
bool prepend_it;
#if defined(RTEMS_SMP)
unsigned int seq;
do {
seq = _SMP_sequence_lock_Read_begin( &node->Priority.Lock );
#endif
priority = node->Priority.value;
prepend_it = node->Priority.prepend_it;
#if defined(RTEMS_SMP)
} while ( _SMP_sequence_lock_Read_retry( &node->Priority.Lock, seq ) );
#endif
*prepend_it_p = prepend_it;
return priority;
}
RTEMS_INLINE_ROUTINE void _Scheduler_Node_set_priority(
Scheduler_Node *node,
Priority_Control new_priority,
bool prepend_it
)
{
#if defined(RTEMS_SMP)
unsigned int seq;
seq = _SMP_sequence_lock_Write_begin( &node->Priority.Lock );
#endif
node->Priority.value = new_priority;
node->Priority.prepend_it = prepend_it;
#if defined(RTEMS_SMP)
_SMP_sequence_lock_Write_end( &node->Priority.Lock, seq );
#endif
}
RTEMS_INLINE_ROUTINE void _Scheduler_Thread_set_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
@@ -893,21 +808,6 @@ typedef void ( *Scheduler_Release_idle_thread )(
Thread_Control *idle
);
RTEMS_INLINE_ROUTINE Thread_Control *_Scheduler_Node_get_idle(
const Scheduler_Node *node
)
{
return node->idle;
}
RTEMS_INLINE_ROUTINE void _Scheduler_Node_set_user(
Scheduler_Node *node,
Thread_Control *user
)
{
node->user = user;
}
RTEMS_INLINE_ROUTINE void _Scheduler_Thread_set_node(
Thread_Control *the_thread,
Scheduler_Node *node
@@ -205,12 +205,6 @@ typedef struct {
} Priority;
} Scheduler_Node;
#define SCHEDULER_NODE_OF_WAIT_CHAIN_NODE( node ) \
RTEMS_CONTAINER_OF( node, Scheduler_Node, Wait.Node.Chain )
#define SCHEDULER_NODE_OF_WAIT_RBTREE_NODE( node ) \
RTEMS_CONTAINER_OF( node, Scheduler_Node, Wait.Node.RBTree )
#ifdef __cplusplus
}
#endif /* __cplusplus */
@@ -0,0 +1,134 @@
/*
* Copyright (c) 2014, 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.
*/
#ifndef _RTEMS_SCORE_SCHEDULERNODEIMPL_H
#define _RTEMS_SCORE_SCHEDULERNODEIMPL_H
#include <rtems/score/schedulernode.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define SCHEDULER_NODE_OF_WAIT_CHAIN_NODE( node ) \
RTEMS_CONTAINER_OF( node, Scheduler_Node, Wait.Node.Chain )
#define SCHEDULER_NODE_OF_WAIT_RBTREE_NODE( node ) \
RTEMS_CONTAINER_OF( node, Scheduler_Node, Wait.Node.RBTree )
RTEMS_INLINE_ROUTINE void _Scheduler_Node_do_initialize(
Scheduler_Node *node,
Thread_Control *the_thread,
Priority_Control priority
)
{
node->owner = the_thread;
node->Priority.value = priority;
node->Priority.prepend_it = false;
#if defined(RTEMS_SMP)
node->user = the_thread;
node->help_state = SCHEDULER_HELP_YOURSELF;
node->idle = NULL;
node->accepts_help = the_thread;
_SMP_sequence_lock_Initialize( &node->Priority.Lock );
#else
(void) the_thread;
#endif
}
RTEMS_INLINE_ROUTINE Thread_Control *_Scheduler_Node_get_owner(
const Scheduler_Node *node
)
{
return node->owner;
}
RTEMS_INLINE_ROUTINE Priority_Control _Scheduler_Node_get_priority(
Scheduler_Node *node,
bool *prepend_it_p
)
{
Priority_Control priority;
bool prepend_it;
#if defined(RTEMS_SMP)
unsigned int seq;
do {
seq = _SMP_sequence_lock_Read_begin( &node->Priority.Lock );
#endif
priority = node->Priority.value;
prepend_it = node->Priority.prepend_it;
#if defined(RTEMS_SMP)
} while ( _SMP_sequence_lock_Read_retry( &node->Priority.Lock, seq ) );
#endif
*prepend_it_p = prepend_it;
return priority;
}
RTEMS_INLINE_ROUTINE void _Scheduler_Node_set_priority(
Scheduler_Node *node,
Priority_Control new_priority,
bool prepend_it
)
{
#if defined(RTEMS_SMP)
unsigned int seq;
seq = _SMP_sequence_lock_Write_begin( &node->Priority.Lock );
#endif
node->Priority.value = new_priority;
node->Priority.prepend_it = prepend_it;
#if defined(RTEMS_SMP)
_SMP_sequence_lock_Write_end( &node->Priority.Lock, seq );
#endif
}
#if defined(RTEMS_SMP)
RTEMS_INLINE_ROUTINE Thread_Control *_Scheduler_Node_get_user(
const Scheduler_Node *node
)
{
return node->user;
}
RTEMS_INLINE_ROUTINE void _Scheduler_Node_set_user(
Scheduler_Node *node,
Thread_Control *user
)
{
node->user = user;
}
RTEMS_INLINE_ROUTINE Thread_Control *_Scheduler_Node_get_idle(
const Scheduler_Node *node
)
{
return node->idle;
}
#endif
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _RTEMS_SCORE_SCHEDULERNODEIMPL_H */
@@ -28,6 +28,7 @@
#include <rtems/score/isr.h>
#include <rtems/score/objectimpl.h>
#include <rtems/score/resourceimpl.h>
#include <rtems/score/schedulernodeimpl.h>
#include <rtems/score/statesimpl.h>
#include <rtems/score/status.h>
#include <rtems/score/sysstate.h>
+4
View File
@@ -260,6 +260,10 @@ $(PROJECT_INCLUDE)/rtems/score/schedulernode.h: include/rtems/score/schedulernod
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/schedulernode.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/schedulernode.h
$(PROJECT_INCLUDE)/rtems/score/schedulernodeimpl.h: include/rtems/score/schedulernodeimpl.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/schedulernodeimpl.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/schedulernodeimpl.h
$(PROJECT_INCLUDE)/rtems/score/schedulerpriority.h: include/rtems/score/schedulerpriority.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/schedulerpriority.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/schedulerpriority.h