From 8042961d87b10e0bf0b0f021e24dbb8eb1979841 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 25 Sep 2006 13:38:24 +0000 Subject: 2006-09-25 Joel Sherrill * rtems/Makefile.am, rtems/preinstall.am, rtems/include/rtems.h, rtems/include/rtems/rtems/attr.h, rtems/include/rtems/rtems/config.h, rtems/inline/rtems/rtems/attr.inl, rtems/macros/rtems/rtems/attr.inl: Add Classic API Barriers. * rtems/include/rtems/rtems/barrier.h, rtems/include/rtems/rtems/barriermp.h, rtems/inline/rtems/rtems/barrier.inl, rtems/macros/rtems/rtems/barrier.inl, rtems/src/barrier.c, rtems/src/barriercreate.c, rtems/src/barrierdelete.c, rtems/src/barrierident.c, rtems/src/barrierrelease.c, rtems/src/barriertranslatereturncode.c, rtems/src/barrierwait.c: New files. --- cpukit/ChangeLog | 15 ++ cpukit/rtems/Makefile.am | 16 ++- cpukit/rtems/include/rtems.h | 1 + cpukit/rtems/include/rtems/rtems/attr.h | 25 ++-- cpukit/rtems/include/rtems/rtems/barrier.h | 195 ++++++++++++++++++++++++++ cpukit/rtems/include/rtems/rtems/barriermp.h | 141 +++++++++++++++++++ cpukit/rtems/include/rtems/rtems/config.h | 3 +- cpukit/rtems/inline/rtems/rtems/attr.inl | 17 +++ cpukit/rtems/inline/rtems/rtems/barrier.inl | 79 +++++++++++ cpukit/rtems/macros/rtems/rtems/attr.inl | 9 ++ cpukit/rtems/macros/rtems/rtems/barrier.inl | 49 +++++++ cpukit/rtems/preinstall.am | 12 ++ cpukit/rtems/src/barrier.c | 66 +++++++++ cpukit/rtems/src/barriercreate.c | 92 ++++++++++++ cpukit/rtems/src/barrierdelete.c | 71 ++++++++++ cpukit/rtems/src/barrierident.c | 56 ++++++++ cpukit/rtems/src/barrierrelease.c | 66 +++++++++ cpukit/rtems/src/barriertranslatereturncode.c | 49 +++++++ cpukit/rtems/src/barrierwait.c | 67 +++++++++ 19 files changed, 1015 insertions(+), 14 deletions(-) create mode 100644 cpukit/rtems/include/rtems/rtems/barrier.h create mode 100644 cpukit/rtems/include/rtems/rtems/barriermp.h create mode 100644 cpukit/rtems/inline/rtems/rtems/barrier.inl create mode 100644 cpukit/rtems/macros/rtems/rtems/barrier.inl create mode 100644 cpukit/rtems/src/barrier.c create mode 100644 cpukit/rtems/src/barriercreate.c create mode 100644 cpukit/rtems/src/barrierdelete.c create mode 100644 cpukit/rtems/src/barrierident.c create mode 100644 cpukit/rtems/src/barrierrelease.c create mode 100644 cpukit/rtems/src/barriertranslatereturncode.c create mode 100644 cpukit/rtems/src/barrierwait.c diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index b0010f4eb5..09e860a9f1 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,3 +1,18 @@ +2006-09-25 Joel Sherrill + + * rtems/Makefile.am, rtems/preinstall.am, rtems/include/rtems.h, + rtems/include/rtems/rtems/attr.h, rtems/include/rtems/rtems/config.h, + rtems/inline/rtems/rtems/attr.inl, rtems/macros/rtems/rtems/attr.inl: + Add Classic API Barriers. + * rtems/include/rtems/rtems/barrier.h, + rtems/include/rtems/rtems/barriermp.h, + rtems/inline/rtems/rtems/barrier.inl, + rtems/macros/rtems/rtems/barrier.inl, rtems/src/barrier.c, + rtems/src/barriercreate.c, rtems/src/barrierdelete.c, + rtems/src/barrierident.c, rtems/src/barrierrelease.c, + rtems/src/barriertranslatereturncode.c, rtems/src/barrierwait.c: + New files. + 2006-09-25 Joel Sherrill * score/Makefile.am, score/preinstall.am, diff --git a/cpukit/rtems/Makefile.am b/cpukit/rtems/Makefile.am index 352214d0d3..69738b5405 100644 --- a/cpukit/rtems/Makefile.am +++ b/cpukit/rtems/Makefile.am @@ -18,7 +18,8 @@ include_HEADERS = include/rtems.h include_rtems_rtemsdir = $(includedir)/rtems/rtems include_rtems_rtems_HEADERS = include/rtems/rtems/asr.h \ - include/rtems/rtems/attr.h include/rtems/rtems/cache.h \ + include/rtems/rtems/attr.h include/rtems/rtems/barrier.h \ + include/rtems/rtems/cache.h \ include/rtems/rtems/clock.h include/rtems/rtems/config.h \ include/rtems/rtems/dpmem.h include/rtems/rtems/event.h \ include/rtems/rtems/eventset.h include/rtems/rtems/intr.h \ @@ -41,7 +42,8 @@ endif if INLINE include_rtems_rtems_HEADERS += inline/rtems/rtems/asr.inl \ - inline/rtems/rtems/attr.inl inline/rtems/rtems/dpmem.inl \ + inline/rtems/rtems/attr.inl inline/rtems/rtems/barrier.inl \ + inline/rtems/rtems/dpmem.inl \ inline/rtems/rtems/event.inl inline/rtems/rtems/eventset.inl \ inline/rtems/rtems/message.inl inline/rtems/rtems/modes.inl \ inline/rtems/rtems/options.inl inline/rtems/rtems/part.inl \ @@ -51,7 +53,8 @@ include_rtems_rtems_HEADERS += inline/rtems/rtems/asr.inl \ inline/rtems/rtems/timer.inl else include_rtems_rtems_HEADERS += macros/rtems/rtems/asr.inl \ - macros/rtems/rtems/attr.inl macros/rtems/rtems/dpmem.inl \ + macros/rtems/rtems/attr.inl macros/rtems/rtems/barrier.inl \ + macros/rtems/rtems/dpmem.inl \ macros/rtems/rtems/event.inl macros/rtems/rtems/eventset.inl \ macros/rtems/rtems/message.inl macros/rtems/rtems/modes.inl \ macros/rtems/rtems/options.inl macros/rtems/rtems/part.inl \ @@ -80,8 +83,13 @@ librtems_a_SOURCES += src/ratemon.c src/ratemoncancel.c src/ratemoncreate.c \ ## INTR_C_FILES librtems_a_SOURCES += src/intr.c src/intrbody.c src/intrcatch.c +## BARRIER_C_FILES +librtems_a_SOURCES += src/barrier.c src/barriercreate.c src/barrierdelete.c \ + src/barrierident.c src/barriertranslatereturncode.c src/barrierwait.c + ## CLOCK_C_FILES -librtems_a_SOURCES += src/rtclock.c src/clockget.c src/clockset.c src/clocktick.c +librtems_a_SOURCES += src/rtclock.c src/clockget.c src/clockset.c \ + src/clocktick.c ## TIMER_C_FILES librtems_a_SOURCES += src/rtemstimer.c src/timercancel.c src/timercreate.c \ diff --git a/cpukit/rtems/include/rtems.h b/cpukit/rtems/include/rtems.h index 2cbfee49f0..b4eb12a1c7 100644 --- a/cpukit/rtems/include/rtems.h +++ b/cpukit/rtems/include/rtems.h @@ -46,6 +46,7 @@ extern "C" { #include #include #include +#include #include #include #include diff --git a/cpukit/rtems/include/rtems/rtems/attr.h b/cpukit/rtems/include/rtems/rtems/attr.h index 22e78ee052..f37e8caa33 100644 --- a/cpukit/rtems/include/rtems/rtems/attr.h +++ b/cpukit/rtems/include/rtems/rtems/attr.h @@ -31,28 +31,35 @@ typedef uint32_t rtems_attribute; #define RTEMS_DEFAULT_ATTRIBUTES 0x00000000 -#define RTEMS_NO_FLOATING_POINT 0x00000000 /* don't use FP HW */ -#define RTEMS_FLOATING_POINT 0x00000001 /* utilize coprocessor */ - #define RTEMS_LOCAL 0x00000000 /* local resource */ #define RTEMS_GLOBAL 0x00000002 /* global resource */ #define RTEMS_FIFO 0x00000000 /* process RTEMS_FIFO */ #define RTEMS_PRIORITY 0x00000004 /* process by priority */ + /* RTEMS Task Specific Attributes */ +#define RTEMS_NO_FLOATING_POINT 0x00000000 /* don't use FP HW */ +#define RTEMS_FLOATING_POINT 0x00000001 /* utilize coprocessor */ + + /* RTEMS Semaphore Specific Attributes */ #define RTEMS_SEMAPHORE_CLASS 0x00000030 /* mask */ #define RTEMS_COUNTING_SEMAPHORE 0x00000000 #define RTEMS_BINARY_SEMAPHORE 0x00000010 #define RTEMS_SIMPLE_BINARY_SEMAPHORE 0x00000020 -#define RTEMS_NO_INHERIT_PRIORITY 0x00000000 -#define RTEMS_INHERIT_PRIORITY 0x00000040 +#define RTEMS_NO_INHERIT_PRIORITY 0x00000000 +#define RTEMS_INHERIT_PRIORITY 0x00000040 + +#define RTEMS_NO_PRIORITY_CEILING 0x00000000 +#define RTEMS_PRIORITY_CEILING 0x00000080 -#define RTEMS_NO_PRIORITY_CEILING 0x00000000 -#define RTEMS_PRIORITY_CEILING 0x00000080 + /* RTEMS Barrier Specific Attributes */ +#define RTEMS_BARRIER_AUTOMATIC_RELEASE 0x00000010 +#define RTEMS_BARRIER_MANUAL_RELEASE 0x00000000 -#define RTEMS_APPLICATION_TASK 0x00000000 -#define RTEMS_SYSTEM_TASK 0x00000100 + /* RTEMS Internal Task Specific Attributes */ +#define RTEMS_APPLICATION_TASK 0x00000000 +#define RTEMS_SYSTEM_TASK 0x00008000 #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) diff --git a/cpukit/rtems/include/rtems/rtems/barrier.h b/cpukit/rtems/include/rtems/rtems/barrier.h new file mode 100644 index 0000000000..f9c8e909ee --- /dev/null +++ b/cpukit/rtems/include/rtems/rtems/barrier.h @@ -0,0 +1,195 @@ +/** + * @file rtems/rtems/barrier.h + */ + +/* + * This include file contains all the constants and structures associated + * with the Barrier Manager. + * + * Directives provided are: + * + * + create a barrier + * + get an ID of a barrier + * + delete a barrier + * + wait for a barrier + * + signal a barrier + * + * COPYRIGHT (c) 1989-2006. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#ifndef _RTEMS_RTEMS_BARRIER_H +#define _RTEMS_RTEMS_BARRIER_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include + +/** + * This type defines the control block used to manage each barrier. + */ + +typedef struct { + /** This is used to manage a barrier as an object. */ + Objects_Control Object; + /** This is used to specify the attributes of a barrier. */ + rtems_attribute attribute_set; + /** This is used to implement the barrier. */ + CORE_barrier_Control Barrier; +} Barrier_Control; + +/** + * The following defines the information control block used to manage + * this class of objects. + */ + +RTEMS_EXTERN Objects_Information _Barrier_Information; + +/** + * @brief _Barrier_Manager_initialization + * + * This routine performs the initialization necessary for this manager. + * + * @param[in] maximum_barriers is the total number of barriers allowed to + * concurrently be active in the system. + */ + +void _Barrier_Manager_initialization( + uint32_t maximum_barriers +); + +/** + * @brief rtems_barrier_create + * + * This routine implements the rtems_barrier_create directive. The + * barrier will have the name name. The starting count for + * the barrier is count. The attribute_set determines if + * the barrier is global or local and the thread queue + * discipline. It returns the id of the created barrier in ID. + * + * @param[in] name is the name of this barrier instance. + * @param[in] attribute_set specifies the attributes of this barrier instance. + * @param[in] maximum_waiters is the maximum number of threads which will + * be allowed to concurrently wait at the barrier. + * @param[out] id will contain the id of this barrier. + * + * @return a status code indicating success or the reason for failure. + */ + +rtems_status_code rtems_barrier_create( + rtems_name name, + rtems_attribute attribute_set, + uint32_t maximum_waiters, + rtems_id *id +); + +/** + * @brief rtems_barrier_ident + * + * This routine implements the rtems_barrier_ident directive. + * This directive returns the barrier ID associated with name. + * If more than one barrier is named name, then the barrier + * to which the ID belongs is arbitrary. node indicates the + * extent of the search for the ID of the barrier named name. + * The search can be limited to a particular node or allowed to + * encompass all nodes. + * + * @param[in] name is the name of this barrier instance. + * @param[out] id will contain the id of this barrier. + * + * @return a status code indicating success or the reason for failure. + */ + +rtems_status_code rtems_barrier_ident( + rtems_name name, + rtems_id *id +); + +/** + * @brief rtems_barrier_delete + * + * This routine implements the rtems_barrier_delete directive. The + * barrier indicated by @a id is deleted. + * + * @param[in] id indicates the barrier to delete + * + * @return a status code indicating success or the reason for failure. + */ +rtems_status_code rtems_barrier_delete( + rtems_id id +); + +/** + * @brief rtems_barrier_wait + * + * This routine implements the rtems_barrier_wait directive. It + * attempts to wait at the barrier associated with @a id. The calling task + * may block waiting for the barrier with an optional timeout of @a timeout + * clock ticks. + * + * @param[in] id indicates the barrier to wait at. + * @param[in] option_set indicates if the caller is willing to wait. + * @param[in] timeout is the maximum length of time in ticks the calling + * thread is willing to block. + * + * @return a status code indicating success or the reason for failure. + */ +rtems_status_code rtems_barrier_wait( + rtems_id id, + rtems_interval timeout +); + +/** + * @brief rtems_barrier_release + * + * This routine implements the rtems_barrier_release directive. It + * unblocks all of the threads waiting on the barrier associated with + * @a id. The number of threads unblocked is returns in @a unblocked. + * + * + * @param[in] id indicates the barrier to wait at. + * @param[out] unblocked will contain the number of threads unblocked. + * + * @return a status code indicating success or the reason for failure. + */ +rtems_status_code rtems_barrier_release( + rtems_id id, + uint32_t *unblocked +); + +/** + * @brief Translate SuperCore Barrier Status Code to RTEMS Status Code + * + * This function returns a RTEMS status code based on the barrier + * status code specified. + * + * @param[in] the_status is the SuperCore Barrier status to translate. + * + * @return a status code indicating success or the reason for failure. + */ +rtems_status_code _Barrier_Translate_core_barrier_return_code ( + CORE_barrier_Status the_status +); + +#ifndef __RTEMS_APPLICATION__ +#include +#endif + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ diff --git a/cpukit/rtems/include/rtems/rtems/barriermp.h b/cpukit/rtems/include/rtems/rtems/barriermp.h new file mode 100644 index 0000000000..c09b1fc6ff --- /dev/null +++ b/cpukit/rtems/include/rtems/rtems/barriermp.h @@ -0,0 +1,141 @@ +/** + * @file rtems/rtems/barriermp.h + */ + +/* + * This include file contains all the constants and structures associated + * with the Multiprocessing Support in the Barrier Manager. + * + * COPYRIGHT (c) 1989-2006. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#ifndef _RTEMS_RTEMS_SEMMP_H +#define _RTEMS_RTEMS_SEMMP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include + +/** + * The following enumerated type defines the list of + * remote barrier operations. + */ +typedef enum { + BARRIER_MP_ANNOUNCE_CREATE = 0, + BARRIER_MP_ANNOUNCE_DELETE = 1, + BARRIER_MP_EXTRACT_PROXY = 2, + BARRIER_MP_WAIT_REQUEST = 3, + BARRIER_MP_WAIT_RESPONSE = 4, + BARRIER_MP_RELEASE_REQUEST = 5, + BARRIER_MP_RELEASE_RESPONSE = 6 +} Barrier_MP_Remote_operations; + +/** + * The following data structure defines the packet used to perform + * remote barrier operations. + */ +typedef struct { + rtems_packet_prefix Prefix; + Barrier_MP_Remote_operations operation; + rtems_name name; + rtems_option option_set; + Objects_Id proxy_id; +} Barrier_MP_Packet; + +/** + * @brief _Barrier_MP_Send_process_packet + * + * This routine performs a remote procedure call so that a + * process operation can be performed on another node. + */ +void _Barrier_MP_Send_process_packet ( + Barrier_MP_Remote_operations operation, + Objects_Id barrier_id, + rtems_name name, + Objects_Id proxy_id +); + +/** + * @brief _Barrier_MP_Send_request_packet + * + * This routine performs a remote procedure call so that a + * directive operation can be initiated on another node. + */ +rtems_status_code _Barrier_MP_Send_request_packet ( + Barrier_MP_Remote_operations operation, + Objects_Id barrier_id, + rtems_interval timeout +); + +/** + * @brief _Barrier_MP_Send_response_packet + * + * This routine performs a remote procedure call so that a + * directive can be performed on another node. + */ + +void _Barrier_MP_Send_response_packet ( + Barrier_MP_Remote_operations operation, + Objects_Id barrier_id, + Thread_Control *the_thread +); + +/** + * @brief _Barrier_MP_Process_packet + * + * This routine performs the actions specific to this package for + * the request from another node. + */ +void _Barrier_MP_Process_packet ( + rtems_packet_prefix *the_packet_prefix +); + +/** + * @brief _Barrier_MP_Send_object_was_deleted + * + * This routine is invoked indirectly by the thread queue + * when a proxy has been removed from the thread queue and + * the remote node must be informed of this. + */ +void _Barrier_MP_Send_object_was_deleted ( + Thread_Control *the_proxy +); + +/** + * @brief _Barrier_MP_Send_extract_proxy + * + * This routine is invoked when a task is deleted and it + * has a proxy which must be removed from a thread queue and + * the remote node must be informed of this. + */ +void _Barrier_MP_Send_extract_proxy ( + void *argument +); + +/** + * @brief _Barrier_MP_Get_packet + * + * This function is used to obtain a barrier mp packet. + */ +Barrier_MP_Packet *_Barrier_MP_Get_packet ( void ); + +#ifdef __cplusplus +} +#endif + +#endif +/* end of file */ diff --git a/cpukit/rtems/include/rtems/rtems/config.h b/cpukit/rtems/include/rtems/rtems/config.h index d9c43d556d..3cc64cfe97 100644 --- a/cpukit/rtems/include/rtems/rtems/config.h +++ b/cpukit/rtems/include/rtems/rtems/config.h @@ -6,7 +6,7 @@ * This include file contains the table of user defined configuration * parameters specific for the RTEMS API. * - * COPYRIGHT (c) 1989-1999. + * COPYRIGHT (c) 1989-2006. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -44,6 +44,7 @@ typedef struct { uint32_t maximum_regions; uint32_t maximum_ports; uint32_t maximum_periods; + uint32_t maximum_barriers; uint32_t number_of_initialization_tasks; rtems_initialization_tasks_table *User_initialization_tasks_table; } rtems_api_configuration_table; diff --git a/cpukit/rtems/inline/rtems/rtems/attr.inl b/cpukit/rtems/inline/rtems/rtems/attr.inl index 387bf6b888..54dd93d729 100644 --- a/cpukit/rtems/inline/rtems/rtems/attr.inl +++ b/cpukit/rtems/inline/rtems/rtems/attr.inl @@ -194,6 +194,23 @@ RTEMS_INLINE_ROUTINE boolean _Attributes_Is_priority_ceiling( return ( attribute_set & RTEMS_PRIORITY_CEILING ); } +/*PAGE + * + * _Attributes_Is_barrier_automatic + * + * DESCRIPTION: + * + * This function returns TRUE if the barrier automatic release + * attribute is enabled in the attribute_set and FALSE otherwise. + */ + +RTEMS_INLINE_ROUTINE boolean _Attributes_Is_barrier_automatic( + rtems_attribute attribute_set +) +{ + return ( attribute_set & RTEMS_BARRIER_AUTOMATIC_RELEASE ); +} + /*PAGE * * _Attributes_Is_system_task diff --git a/cpukit/rtems/inline/rtems/rtems/barrier.inl b/cpukit/rtems/inline/rtems/rtems/barrier.inl new file mode 100644 index 0000000000..e296b88e72 --- /dev/null +++ b/cpukit/rtems/inline/rtems/rtems/barrier.inl @@ -0,0 +1,79 @@ +/** + * @file rtems/rtems/barrier.inl + */ + +/* + * This file contains the static inlin implementation of the inlined + * routines from the Barrier Manager. + * + * COPYRIGHT (c) 1989-2006. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#ifndef _RTEMS_RTEMS_BARRIER_INL +#define _RTEMS_RTEMS_BARRIER_INL + +/** + * @brief _Barrier_Allocate + * + * This function allocates a barrier control block from + * the inactive chain of free barrier control blocks. + */ +RTEMS_INLINE_ROUTINE Barrier_Control *_Barrier_Allocate( void ) +{ + return (Barrier_Control *) _Objects_Allocate( &_Barrier_Information ); +} + +/** + * @brief _Barrier_Free + * + * This routine frees a barrier control block to the + * inactive chain of free barrier control blocks. + */ +RTEMS_INLINE_ROUTINE void _Barrier_Free ( + Barrier_Control *the_barrier +) +{ + _Objects_Free( &_Barrier_Information, &the_barrier->Object ); +} + +/** + * @brief _Barrier_Get + * + * This function maps barrier IDs to barrier control blocks. + * If ID corresponds to a local barrier, then it returns + * the_barrier control pointer which maps to ID and location + * is set to OBJECTS_LOCAL. if the barrier ID is global and + * resides on a remote node, then location is set to OBJECTS_REMOTE, + * and the_barrier is undefined. Otherwise, location is set + * to OBJECTS_ERROR and the_barrier is undefined. + */ +RTEMS_INLINE_ROUTINE Barrier_Control *_Barrier_Get ( + Objects_Id id, + Objects_Locations *location +) +{ + return (Barrier_Control *) + _Objects_Get( &_Barrier_Information, id, location ); +} + +/** + * @brief _Barrier_Is_null + * + * This function returns TRUE if the_barrier is NULL and FALSE otherwise. + */ +RTEMS_INLINE_ROUTINE boolean _Barrier_Is_null ( + Barrier_Control *the_barrier +) +{ + return ( the_barrier == NULL ); +} + +#endif +/* end of include file */ diff --git a/cpukit/rtems/macros/rtems/rtems/attr.inl b/cpukit/rtems/macros/rtems/rtems/attr.inl index 7f40bbdad3..fb6055325e 100644 --- a/cpukit/rtems/macros/rtems/rtems/attr.inl +++ b/cpukit/rtems/macros/rtems/rtems/attr.inl @@ -109,6 +109,15 @@ #define _Attributes_Is_priority_ceiling( _attribute_set ) \ ( (_attribute_set) & RTEMS_PRIORITY_CEILING ) +/*PAGE + * + * _Attributes_Is_barrier_automatic + * + */ + +#define _Attributes_Is_barrier_automatic( _attribute_set ) \ + ( (_attribute_set) & RTEMS_BARRIER_AUTOMATIC_RELEASE ) + /*PAGE * * _Attributes_Is_system_task diff --git a/cpukit/rtems/macros/rtems/rtems/barrier.inl b/cpukit/rtems/macros/rtems/rtems/barrier.inl new file mode 100644 index 0000000000..c51bb580c2 --- /dev/null +++ b/cpukit/rtems/macros/rtems/rtems/barrier.inl @@ -0,0 +1,49 @@ +/** + * @file rtems/rtems/barrier.inl + */ + +/* + * This file contains the macro implementation of the inlined + * routines from the Barrier Manager. + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#ifndef _RTEMS_RTEMS_BARRIER_INL +#define _RTEMS_RTEMS_BARRIER_INL + +/* + * _Barrier_Allocate + */ +#define _Barrier_Allocate() \ + (Barrier_Control *) _Objects_Allocate( &_Barrier_Information ) + +/* + * _Barrier_Free + */ +#define _Barrier_Free( _the_barrier ) \ + _Objects_Free( &_Barrier_Information, &(_the_barrier)->Object ) + +/* + * _Barrier_Get + */ + +#define _Barrier_Get( _id, _location ) \ + (Barrier_Control *) \ + _Objects_Get( &_Barrier_Information, (_id), (_location) ) + +/* + * _Barrier_Is_null + */ +#define _Barrier_Is_null( _the_barrier ) \ + ( (_the_barrier) == NULL ) + +#endif +/* end of include file */ diff --git a/cpukit/rtems/preinstall.am b/cpukit/rtems/preinstall.am index 135e37b020..8ec64661c0 100644 --- a/cpukit/rtems/preinstall.am +++ b/cpukit/rtems/preinstall.am @@ -35,6 +35,10 @@ $(PROJECT_INCLUDE)/rtems/rtems/attr.h: include/rtems/rtems/attr.h $(PROJECT_INCL $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rtems/attr.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rtems/attr.h +$(PROJECT_INCLUDE)/rtems/rtems/barrier.h: include/rtems/rtems/barrier.h $(PROJECT_INCLUDE)/rtems/rtems/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rtems/barrier.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rtems/barrier.h + $(PROJECT_INCLUDE)/rtems/rtems/cache.h: include/rtems/rtems/cache.h $(PROJECT_INCLUDE)/rtems/rtems/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rtems/cache.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rtems/cache.h @@ -161,6 +165,10 @@ $(PROJECT_INCLUDE)/rtems/rtems/attr.inl: inline/rtems/rtems/attr.inl $(PROJECT_I $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rtems/attr.inl PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rtems/attr.inl +$(PROJECT_INCLUDE)/rtems/rtems/barrier.inl: inline/rtems/rtems/barrier.inl $(PROJECT_INCLUDE)/rtems/rtems/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rtems/barrier.inl +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rtems/barrier.inl + $(PROJECT_INCLUDE)/rtems/rtems/dpmem.inl: inline/rtems/rtems/dpmem.inl $(PROJECT_INCLUDE)/rtems/rtems/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rtems/dpmem.inl PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rtems/dpmem.inl @@ -226,6 +234,10 @@ $(PROJECT_INCLUDE)/rtems/rtems/attr.inl: macros/rtems/rtems/attr.inl $(PROJECT_I $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rtems/attr.inl PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rtems/attr.inl +$(PROJECT_INCLUDE)/rtems/rtems/barrier.inl: macros/rtems/rtems/barrier.inl $(PROJECT_INCLUDE)/rtems/rtems/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rtems/barrier.inl +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rtems/barrier.inl + $(PROJECT_INCLUDE)/rtems/rtems/dpmem.inl: macros/rtems/rtems/dpmem.inl $(PROJECT_INCLUDE)/rtems/rtems/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/rtems/dpmem.inl PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/rtems/dpmem.inl diff --git a/cpukit/rtems/src/barrier.c b/cpukit/rtems/src/barrier.c new file mode 100644 index 0000000000..bc57a390c4 --- /dev/null +++ b/cpukit/rtems/src/barrier.c @@ -0,0 +1,66 @@ +/* + * Barrier Manager + * + * DESCRIPTION: + * + * This package is the implementation of the Barrier Manager. + * + * Directives provided are: + * + * + create a barrier + * + get an ID of a barrier + * + delete a barrier + * + acquire a barrier + * + release a barrier + * + * COPYRIGHT (c) 1989-2006. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#if defined(RTEMS_MULTIPROCESSING) +#include +#endif + +/** + * @brief _Barrier_Manager_initialization + * + * Input parameters: + * maximum_barriers - maximum configured barriers + * + * Output parameters: NONE + */ + +void _Barrier_Manager_initialization( + uint32_t maximum_barriers +) +{ + _Objects_Initialize_information( + &_Barrier_Information, /* object information table */ + OBJECTS_CLASSIC_API, /* object API */ + OBJECTS_RTEMS_BARRIERS, /* object class */ + maximum_barriers, /* maximum objects of this class */ + sizeof( Barrier_Control ), /* size of this object's control block */ + FALSE, /* TRUE if the name is a string */ + RTEMS_MAXIMUM_NAME_LENGTH /* maximum length of an object name */ +#if defined(RTEMS_MULTIPROCESSING) + , + FALSE, /* TRUE if this is a global object class */ + NULL /* Proxy extraction support callout */ +#endif + ); +} diff --git a/cpukit/rtems/src/barriercreate.c b/cpukit/rtems/src/barriercreate.c new file mode 100644 index 0000000000..89c4b55ec9 --- /dev/null +++ b/cpukit/rtems/src/barriercreate.c @@ -0,0 +1,92 @@ +/* + * Barrier Manager -- Create a Barrier Instance + * + * COPYRIGHT (c) 1989-2006. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +/* + * rtems_barrier_create + * + * This directive creates a barrier. A barrier id is returned. + * + * Input parameters: + * name - user defined barrier name + * attribute_set - barrier attributes + * maximum_waiters - number of threads before automatic release + * priority_ceiling - barrier's ceiling priority + * id - pointer to barrier id + * + * Output parameters: + * id - barrier id + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + */ + +rtems_status_code rtems_barrier_create( + rtems_name name, + rtems_attribute attribute_set, + uint32_t maximum_waiters, + rtems_id *id +) +{ + Barrier_Control *the_barrier; + CORE_barrier_Attributes the_attributes; + + if ( !rtems_is_name_valid( name ) ) + return RTEMS_INVALID_NAME; + + if ( !id ) + return RTEMS_INVALID_ADDRESS; + + /* Initialize core barrier attributes */ + if ( _Attributes_Is_barrier_automatic( attribute_set ) ) { + the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE; + if ( maximum_waiters == 0 ) + return RTEMS_INVALID_NUMBER; + } else + the_attributes.discipline = CORE_BARRIER_MANUAL_RELEASE; + the_attributes.maximum_count = maximum_waiters; + + _Thread_Disable_dispatch(); /* prevents deletion */ + + the_barrier = _Barrier_Allocate(); + + if ( !the_barrier ) { + _Thread_Enable_dispatch(); + return RTEMS_TOO_MANY; + } + + the_barrier->attribute_set = attribute_set; + + _CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes ); + + _Objects_Open( + &_Barrier_Information, + &the_barrier->Object, + (Objects_Name) name + ); + + *id = the_barrier->Object.id; + + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; +} diff --git a/cpukit/rtems/src/barrierdelete.c b/cpukit/rtems/src/barrierdelete.c new file mode 100644 index 0000000000..6b2a59b0cf --- /dev/null +++ b/cpukit/rtems/src/barrierdelete.c @@ -0,0 +1,71 @@ +/* + * Barrier Manager -- Delete a Barrier + * + * COPYRIGHT (c) 1989-2006. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +/* + * rtems_barrier_delete + * + * This directive allows a thread to delete a barrier specified by + * the barrier id. The barrier is freed back to the inactive + * barrier chain. + * + * Input parameters: + * id - barrier id + * + * Output parameters: + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + */ + +rtems_status_code rtems_barrier_delete( + rtems_id id +) +{ + Barrier_Control *the_barrier; + Objects_Locations location; + + the_barrier = _Barrier_Get( id, &location ); + switch ( location ) { + + case OBJECTS_REMOTE: + case OBJECTS_ERROR: + return RTEMS_INVALID_ID; + + case OBJECTS_LOCAL: + _CORE_barrier_Flush( + &the_barrier->Barrier, + NULL, + CORE_BARRIER_WAS_DELETED + ); + + _Objects_Close( &_Barrier_Information, &the_barrier->Object ); + + _Barrier_Free( the_barrier ); + + _Thread_Enable_dispatch(); + return RTEMS_SUCCESSFUL; + } + + return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ +} diff --git a/cpukit/rtems/src/barrierident.c b/cpukit/rtems/src/barrierident.c new file mode 100644 index 0000000000..a860e08115 --- /dev/null +++ b/cpukit/rtems/src/barrierident.c @@ -0,0 +1,56 @@ +/* + * Barrier Manager Name to ID + * + * COPYRIGHT (c) 1989-2006. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +/* + * rtems_barrier_ident + * + * This directive returns the system ID associated with + * the barrier name. + * + * Input parameters: + * name - user defined barrier name + * id - pointer to barrier id + * + * Output parameters: + * *id - barrier id + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + */ + +rtems_status_code rtems_barrier_ident( + rtems_name name, + rtems_id *id +) +{ + Objects_Name_or_id_lookup_errors status; + + status = _Objects_Name_to_id( + &_Barrier_Information, + (Objects_Name) name, + OBJECTS_SEARCH_LOCAL_NODE, + id + ); + + return _Status_Object_name_errors_to_status[ status ]; +} diff --git a/cpukit/rtems/src/barrierrelease.c b/cpukit/rtems/src/barrierrelease.c new file mode 100644 index 0000000000..0d7f7622ef --- /dev/null +++ b/cpukit/rtems/src/barrierrelease.c @@ -0,0 +1,66 @@ +/* + * Barrier Manager -- Release Tasks Waitng at a Barrier + * + * COPYRIGHT (c) 1989-2006. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +/* + * rtems_barrier_release + * + * This directive releases all threads waiting at a barrier. + * + * Input parameters: + * id - barrier id + * released - pointer to number of threads unblocked + * + * Output parameters: + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + * *released - number of threads unblocked + */ + +rtems_status_code rtems_barrier_release( + rtems_id id, + rtems_unsigned32 *released +) +{ + Barrier_Control *the_barrier; + Objects_Locations location; + + if ( !released ) + return RTEMS_INVALID_ADDRESS; + + the_barrier = _Barrier_Get( id, &location ); + switch ( location ) { + case OBJECTS_REMOTE: + case OBJECTS_ERROR: + return RTEMS_INVALID_ID; + + case OBJECTS_LOCAL: + *released = _CORE_barrier_Release( &the_barrier->Barrier, id, NULL ); + _Thread_Enable_dispatch(); + return _Barrier_Translate_core_barrier_return_code( + _Thread_Executing->Wait.return_code ); + + } + + return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ +} diff --git a/cpukit/rtems/src/barriertranslatereturncode.c b/cpukit/rtems/src/barriertranslatereturncode.c new file mode 100644 index 0000000000..da218166ad --- /dev/null +++ b/cpukit/rtems/src/barriertranslatereturncode.c @@ -0,0 +1,49 @@ +/* + * Barrier Manager -- Translate SuperCore Status + * + * COPYRIGHT (c) 1989-2006. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +/* + * _Barrier_Translate_core_barrier_return_code + * + * Input parameters: + * the_barrier_status - barrier status code to translate + * + * Output parameters: + * rtems status code - translated RTEMS status code + * + */ + +rtems_status_code _Barrier_Translate_core_barrier_return_code_[] = { + RTEMS_SUCCESSFUL, /* CORE_BARRIER_STATUS_SUCCESSFUL */ + RTEMS_SUCCESSFUL, /* CORE_BARRIER_STATUS_AUTOMATICALLY_RELEASED */ + RTEMS_OBJECT_WAS_DELETED, /* CORE_BARRIER_WAS_DELETED */ + RTEMS_TIMEOUT /* CORE_BARRIER_TIMEOUT */ +}; + + +rtems_status_code _Barrier_Translate_core_barrier_return_code ( + CORE_barrier_Status the_barrier_status +) +{ + if ( the_barrier_status > CORE_BARRIER_TIMEOUT ) + return RTEMS_INTERNAL_ERROR; + return _Barrier_Translate_core_barrier_return_code_[the_barrier_status]; +} diff --git a/cpukit/rtems/src/barrierwait.c b/cpukit/rtems/src/barrierwait.c new file mode 100644 index 0000000000..754e1ba969 --- /dev/null +++ b/cpukit/rtems/src/barrierwait.c @@ -0,0 +1,67 @@ +/* + * Barrier Manager -- Wait at a Barrier + * + * COPYRIGHT (c) 1989-2006. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +/* + * rtems_barrier_wait + * + * This directive allows a thread to wait at a barrier. + * + * Input parameters: + * id - barrier id + * timeout - number of ticks to wait (0 means wait forever) + * + * Output parameters: + * RTEMS_SUCCESSFUL - if successful + * error code - if unsuccessful + */ + +rtems_status_code rtems_barrier_wait( + rtems_id id, + rtems_interval timeout +) +{ + Barrier_Control *the_barrier; + Objects_Locations location; + + the_barrier = _Barrier_Get( id, &location ); + switch ( location ) { + case OBJECTS_REMOTE: + case OBJECTS_ERROR: + return RTEMS_INVALID_ID; + + case OBJECTS_LOCAL: + _CORE_barrier_Wait( + &the_barrier->Barrier, + id, + TRUE, + timeout, + NULL + ); + return _Barrier_Translate_core_barrier_return_code( + _Thread_Executing->Wait.return_code ); + + } + + return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ +} -- cgit v1.2.3