[rtems commit] score: Fix Thread_Control and Thread_Proxy_control
Sebastian Huber
sebh at rtems.org
Wed May 6 09:58:33 UTC 2015
Module: rtems
Branch: master
Commit: a6502a58e64eb47b4c987884fdcb6af79fae792c
Changeset: http://git.rtems.org/rtems/commit/?id=a6502a58e64eb47b4c987884fdcb6af79fae792c
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Wed May 6 11:54:19 2015 +0200
score: Fix Thread_Control and Thread_Proxy_control
Fix layout of the common block of Thread_Control and
Thread_Proxy_control. Ensure that the offsets match.
---
cpukit/score/include/rtems/score/thread.h | 124 ++++++++++++++++--------------
cpukit/score/src/thread.c | 19 +++++
2 files changed, 84 insertions(+), 59 deletions(-)
diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h
index bc521bb..72e011c 100644
--- a/cpukit/score/include/rtems/score/thread.h
+++ b/cpukit/score/include/rtems/score/thread.h
@@ -249,6 +249,56 @@ typedef struct {
} Thread_Start_information;
/**
+ * @brief Priority change handler.
+ *
+ * @param[in] the_thread The thread.
+ * @param[in] new_priority The new priority value.
+ * @param[in] context The handler context.
+ *
+ * @see _Thread_Priority_set_change_handler().
+ */
+typedef void (*Thread_Priority_change_handler)(
+ Thread_Control *the_thread,
+ Priority_Control new_priority,
+ void *context
+);
+
+/**
+ * @brief Thread priority control.
+ */
+typedef struct {
+ /**
+ * @brief Generation of the current priority value.
+ *
+ * It is used in _Thread_Change_priority() to serialize the update of
+ * priority related data structures.
+ */
+ uint32_t generation;
+
+ /**
+ * @brief Priority change handler.
+ *
+ * Called by _Thread_Change_priority() to notify a thread about a priority
+ * change. In case this thread waits currently for a resource the handler
+ * may adjust its data structures according to the new priority value. This
+ * handler must not be NULL, instead the default handler
+ * _Thread_Priority_change_do_nothing() should be used in case nothing needs
+ * to be done during a priority change.
+ *
+ * @see _Thread_Priority_set_change_handler() and
+ * _Thread_Priority_restore_default_change_handler().
+ */
+ Thread_Priority_change_handler change_handler;
+
+ /**
+ * @brief Context for priority change handler.
+ *
+ * @see _Thread_Priority_set_change_handler().
+ */
+ void *change_handler_context;
+} Thread_Priority_control;
+
+/**
* @brief Union type to hold a pointer to an immutable or a mutable object.
*
* The main purpose is to enable passing of pointers to read-only send buffers
@@ -339,6 +389,12 @@ typedef struct {
Priority_Control current_priority;
/** This field is the base priority of this proxy. */
Priority_Control real_priority;
+
+ /**
+ * @brief Thread priority control.
+ */
+ Thread_Priority_control Priority;
+
/** This field is the number of mutexes currently held by this proxy. */
uint32_t resource_count;
@@ -375,56 +431,6 @@ typedef enum {
/** This macro defines the last API which has threads. */
#define THREAD_API_LAST THREAD_API_POSIX
-/**
- * @brief Priority change handler.
- *
- * @param[in] the_thread The thread.
- * @param[in] new_priority The new priority value.
- * @param[in] context The handler context.
- *
- * @see _Thread_Priority_set_change_handler().
- */
-typedef void (*Thread_Priority_change_handler)(
- Thread_Control *the_thread,
- Priority_Control new_priority,
- void *context
-);
-
-/**
- * @brief Thread priority control.
- */
-typedef struct {
- /**
- * @brief Generation of the current priority value.
- *
- * It is used in _Thread_Change_priority() to serialize the update of
- * priority related data structures.
- */
- uint32_t generation;
-
- /**
- * @brief Priority change handler.
- *
- * Called by _Thread_Change_priority() to notify a thread about a priority
- * change. In case this thread waits currently for a resource the handler
- * may adjust its data structures according to the new priority value. This
- * handler must not be NULL, instead the default handler
- * _Thread_Priority_change_do_nothing() should be used in case nothing needs
- * to be done during a priority change.
- *
- * @see _Thread_Priority_set_change_handler() and
- * _Thread_Priority_restore_default_change_handler().
- */
- Thread_Priority_change_handler change_handler;
-
- /**
- * @brief Context for priority change handler.
- *
- * @see _Thread_Priority_set_change_handler().
- */
- void *change_handler_context;
-} Thread_Priority_control;
-
typedef struct Thread_Action Thread_Action;
/**
@@ -677,14 +683,6 @@ struct Thread_Control_struct {
/** This field is the number of mutexes currently held by this thread. */
uint32_t resource_count;
-
-#if defined(RTEMS_SMP)
- /**
- * @brief Thread lock control.
- */
- Thread_Lock_control Lock;
-#endif
-
/** This field is the blocking information for this thread. */
Thread_Wait_information Wait;
/** This field is the Watchdog used to manage thread delays and timeouts. */
@@ -693,6 +691,15 @@ struct Thread_Control_struct {
/** This field is the received response packet in an MP system. */
MP_packet_Prefix *receive_packet;
#endif
+ /*================= end of common block =================*/
+
+#if defined(RTEMS_SMP)
+ /**
+ * @brief Thread lock control.
+ */
+ Thread_Lock_control Lock;
+#endif
+
#ifdef __RTEMS_STRICT_ORDER_MUTEX__
/** This field is the head of queue of priority inheritance mutex
* held by the thread.
@@ -706,7 +713,6 @@ struct Thread_Control_struct {
*/
Resource_Node Resource_node;
#endif
- /*================= end of common block =================*/
#if defined(RTEMS_MULTIPROCESSING)
/** This field is true if the thread is offered globally */
bool is_global;
diff --git a/cpukit/score/src/thread.c b/cpukit/score/src/thread.c
index 3cf061f..88b3272 100644
--- a/cpukit/score/src/thread.c
+++ b/cpukit/score/src/thread.c
@@ -21,6 +21,25 @@
#include <rtems/score/threadimpl.h>
#include <rtems/score/interr.h>
+#define THREAD_OFFSET_ASSERT( field ) \
+ RTEMS_STATIC_ASSERT( \
+ offsetof( Thread_Control, field ) == offsetof( Thread_Proxy_control, field ), \
+ field \
+ )
+
+THREAD_OFFSET_ASSERT( Object );
+THREAD_OFFSET_ASSERT( RBNode );
+THREAD_OFFSET_ASSERT( current_state );
+THREAD_OFFSET_ASSERT( current_priority );
+THREAD_OFFSET_ASSERT( real_priority );
+THREAD_OFFSET_ASSERT( Priority );
+THREAD_OFFSET_ASSERT( resource_count );
+THREAD_OFFSET_ASSERT( Wait );
+THREAD_OFFSET_ASSERT( Timer );
+#if defined(RTEMS_MULTIPROCESSING)
+THREAD_OFFSET_ASSERT( receive_packet );
+#endif
+
void _Thread_Handler_initialization(void)
{
rtems_stack_allocate_init_hook stack_allocate_init_hook =
More information about the vc
mailing list