From f14a04c6ef5cde3f812aefd9827eddcf4cf2f13e Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 24 Nov 2017 06:38:07 +0100 Subject: Add RTEMS thread API Update #2843. --- cpukit/include/rtems/thread.h | 289 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 289 insertions(+) create mode 100644 cpukit/include/rtems/thread.h (limited to 'cpukit/include/rtems/thread.h') diff --git a/cpukit/include/rtems/thread.h b/cpukit/include/rtems/thread.h new file mode 100644 index 0000000000..feee612d22 --- /dev/null +++ b/cpukit/include/rtems/thread.h @@ -0,0 +1,289 @@ +/* + * Copyright (c) 2017 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. + */ + +#ifndef _RTEMS_THREAD_H +#define _RTEMS_THREAD_H + +#include +#include +#include + +__BEGIN_DECLS + +/* Temporarily defined, will be shipped with a Newlib update */ +int _Semaphore_Wait_timed_ticks(struct _Semaphore_Control *, __uint32_t); + +/* Temporarily defined, will be shipped with a Newlib update */ +int _Semaphore_Try_wait(struct _Semaphore_Control *); + +/* Temporarily defined, will be shipped with a Newlib update */ +void _Semaphore_Post_binary(struct _Semaphore_Control *); + +typedef struct _Mutex_Control rtems_mutex; + +#define RTEMS_MUTEX_INITIALIZER( name ) _MUTEX_NAMED_INITIALIZER( name ) + +static __inline void rtems_mutex_init( rtems_mutex *mutex, const char *name ) +{ + _Mutex_Initialize_named( mutex, name ); +} + +static __inline const char *rtems_mutex_get_name( const rtems_mutex *mutex ) +{ + return mutex->_Queue._name; +} + +static __inline void rtems_mutex_set_name( rtems_mutex *mutex, const char *name ) +{ + mutex->_Queue._name = name; +} + +static __inline void rtems_mutex_lock( rtems_mutex *mutex ) +{ + _Mutex_Acquire( mutex ); +} + +static __inline void rtems_mutex_unlock( rtems_mutex *mutex ) +{ + _Mutex_Release( mutex ); +} + +static __inline void rtems_mutex_destroy( rtems_mutex *mutex ) +{ + _Mutex_Destroy( mutex ); +} + +typedef struct _Mutex_recursive_Control rtems_recursive_mutex; + +#define RTEMS_RECURSIVE_MUTEX_INITIALIZER( name ) \ + _MUTEX_RECURSIVE_NAMED_INITIALIZER( name ) + +static __inline void rtems_recursive_mutex_init( + rtems_recursive_mutex *mutex, const char *name +) +{ + _Mutex_recursive_Initialize_named( mutex, name ); +} + +static __inline const char *rtems_recursive_mutex_get_name( + const rtems_recursive_mutex *mutex +) +{ + return mutex->_Mutex._Queue._name; +} + +static __inline void rtems_recursive_mutex_set_name( + rtems_recursive_mutex *mutex, const char *name +) +{ + mutex->_Mutex._Queue._name = name; +} + +static __inline void rtems_recursive_mutex_lock( + rtems_recursive_mutex *mutex +) +{ + _Mutex_recursive_Acquire( mutex ); +} + +static __inline void rtems_recursive_mutex_unlock( + rtems_recursive_mutex *mutex +) +{ + _Mutex_recursive_Release( mutex ); +} + +static __inline void rtems_recursive_mutex_destroy( + rtems_recursive_mutex *mutex +) +{ + _Mutex_recursive_Destroy( mutex ); +} + +typedef struct _Condition_Control rtems_condition_variable; + +#define RTEMS_CONDITION_VARIABLE_INITIALIZER( name ) \ + _CONDITION_NAMED_INITIALIZER( name ) + +static __inline void rtems_condition_variable_init( + rtems_condition_variable *condition_variable, + const char *name +) +{ + _Condition_Initialize_named( condition_variable, name ); +} + +static __inline const char *rtems_condition_variable_get_name( + const rtems_condition_variable *condition_variable +) +{ + return condition_variable->_Queue._name; +} + +static __inline void rtems_condition_variable_set_name( + rtems_condition_variable *condition_variable, + const char *name +) +{ + condition_variable->_Queue._name = name; +} + +static __inline void rtems_condition_variable_wait( + rtems_condition_variable *condition_variable, + rtems_mutex *mutex +) +{ + _Condition_Wait( condition_variable, mutex ); +} + +static __inline void rtems_condition_variable_signal( + rtems_condition_variable *condition_variable +) +{ + _Condition_Broadcast( condition_variable ); +} + +static __inline void rtems_condition_variable_broadcast( + rtems_condition_variable *condition_variable +) +{ + _Condition_Broadcast( condition_variable ); +} + +static __inline void rtems_condition_variable_destroy( + rtems_condition_variable *condition_variable +) +{ + _Condition_Destroy( condition_variable ); +} + +typedef struct _Semaphore_Control rtems_counting_semaphore; + +#define RTEMS_COUNTING_SEMAPHORE_INITIALIZER( name, value ) \ + _SEMAPHORE_NAMED_INITIALIZER( name, value ) + +static __inline void rtems_counting_semaphore_init( + rtems_counting_semaphore *counting_semaphore, + const char *name, + unsigned int value +) +{ + _Semaphore_Initialize_named( counting_semaphore, name, value ); +} + +static __inline const char *rtems_counting_semaphore_get_name( + const rtems_counting_semaphore *counting_semaphore +) +{ + return counting_semaphore->_Queue._name; +} + +static __inline void rtems_counting_semaphore_set_name( + rtems_counting_semaphore *counting_semaphore, + const char *name +) +{ + counting_semaphore->_Queue._name = name; +} + +static __inline void rtems_counting_semaphore_wait( + rtems_counting_semaphore *counting_semaphore +) +{ + _Semaphore_Wait( counting_semaphore ); +} + +static __inline void rtems_counting_semaphore_post( + rtems_counting_semaphore *counting_semaphore +) +{ + _Semaphore_Post( counting_semaphore ); +} + +static __inline void rtems_counting_semaphore_destroy( + rtems_counting_semaphore *counting_semaphore +) +{ + _Semaphore_Destroy( counting_semaphore ); +} + +typedef struct { + struct _Semaphore_Control Semaphore; +} rtems_binary_semaphore; + +#define RTEMS_BINARY_SEMAPHORE_INITIALIZER( name ) \ + { _SEMAPHORE_NAMED_INITIALIZER( name, 0 ) } + +static __inline void rtems_binary_semaphore_init( + rtems_binary_semaphore *binary_semaphore, + const char *name +) +{ + _Semaphore_Initialize_named( &binary_semaphore->Semaphore, name, 0 ); +} + +static __inline const char *rtems_binary_semaphore_get_name( + const rtems_binary_semaphore *binary_semaphore +) +{ + return binary_semaphore->Semaphore._Queue._name; +} + +static __inline void rtems_binary_semaphore_set_name( + rtems_binary_semaphore *binary_semaphore, + const char *name +) +{ + binary_semaphore->Semaphore._Queue._name = name; +} + +static __inline void rtems_binary_semaphore_wait( + rtems_binary_semaphore *binary_semaphore +) +{ + _Semaphore_Wait( &binary_semaphore->Semaphore ); +} + +static __inline int rtems_binary_semaphore_wait_timed_ticks( + rtems_binary_semaphore *binary_semaphore, + uint32_t ticks +) +{ + return _Semaphore_Wait_timed_ticks( &binary_semaphore->Semaphore, ticks ); +} + +static __inline int rtems_binary_semaphore_try_wait( + rtems_binary_semaphore *binary_semaphore +) +{ + return _Semaphore_Try_wait( &binary_semaphore->Semaphore ); +} + +static __inline void rtems_binary_semaphore_post( + rtems_binary_semaphore *binary_semaphore +) +{ + _Semaphore_Post_binary( &binary_semaphore->Semaphore ); +} + +static __inline void rtems_binary_semaphore_destroy( + rtems_binary_semaphore *binary_semaphore +) +{ + _Semaphore_Destroy( &binary_semaphore->Semaphore ); +} + +__END_DECLS + +#endif /* _RTEMS_THREAD_H */ -- cgit v1.2.3