summaryrefslogtreecommitdiff
path: root/include/rtems/score/apimutex.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/rtems/score/apimutex.h')
-rw-r--r--include/rtems/score/apimutex.h152
1 files changed, 152 insertions, 0 deletions
diff --git a/include/rtems/score/apimutex.h b/include/rtems/score/apimutex.h
new file mode 100644
index 0000000000..615f60b31d
--- /dev/null
+++ b/include/rtems/score/apimutex.h
@@ -0,0 +1,152 @@
+/**
+ * @file
+ *
+ * @ingroup ScoreAPIMutex
+ *
+ * @brief API Mutex Handler API
+ */
+
+/*
+ * COPYRIGHT (c) 1989-2008.
+ * 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.org/license/LICENSE.
+ */
+
+#ifndef _RTEMS_SCORE_APIMUTEX_H
+#define _RTEMS_SCORE_APIMUTEX_H
+
+#include <rtems/score/coremutex.h>
+#include <rtems/score/object.h>
+
+/**
+ * @defgroup ScoreAPIMutex API Mutex Handler
+ *
+ * @ingroup Score
+ *
+ * @brief Provides routines to ensure mutual exclusion on API level.
+ */
+/**@{**/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief Control block used to manage each API mutex.
+ */
+typedef struct {
+ /**
+ * @brief Allows each API Mutex to be a full-fledged RTEMS object.
+ */
+ Objects_Control Object;
+
+ /**
+ * Contains the SuperCore mutex information.
+ */
+ CORE_mutex_Control Mutex;
+
+ /**
+ * @brief The thread life protection state before the outer-most mutex
+ * obtain.
+ */
+ bool previous_thread_life_protection;
+} API_Mutex_Control;
+
+/**
+ * @brief Initialization for the API Mutexe Handler.
+ *
+ * The value @a maximum_mutexes is the maximum number of API mutexes that may
+ * exist at any time.
+ *
+ * @param[in] maximum_mutexes is the maximum number of API mutexes.
+ */
+void _API_Mutex_Initialization( uint32_t maximum_mutexes );
+
+/**
+ * @brief Allocates an API mutex from the inactive set and returns it in
+ * @a mutex.
+ */
+void _API_Mutex_Allocate( API_Mutex_Control **mutex );
+
+/**
+ * @brief Acquires the specified API mutex.
+ *
+ * @param[in] mutex The API mutex.
+ */
+void _API_Mutex_Lock( API_Mutex_Control *mutex );
+
+/**
+ * @brief Releases the specified API mutex.
+ *
+ * @param[in] mutex The API mutex.
+ */
+void _API_Mutex_Unlock( API_Mutex_Control *mutex );
+
+/**
+ * @brief Checks if the specified API mutex is owned by the executing thread.
+ *
+ * @param[in] mutex The API mutex.
+ */
+bool _API_Mutex_Is_owner( const API_Mutex_Control *mutex );
+
+/** @} */
+
+/**
+ * @defgroup ScoreAllocatorMutex RTEMS Allocator Mutex
+ *
+ * @ingroup ScoreAPIMutex
+ *
+ * @brief Protection for all memory allocations and deallocations in RTEMS.
+ *
+ * When the APIs all use this for allocation and deallocation protection, then
+ * this possibly should be renamed and moved to a higher level in the
+ * hierarchy.
+ */
+/**@{**/
+
+/**
+ * @brief Memory allocation mutex.
+ *
+ * This points to the API Mutex instance used to ensure that only
+ * one thread at a time is allocating or freeing memory.
+ */
+SCORE_EXTERN API_Mutex_Control *_RTEMS_Allocator_Mutex;
+
+static inline void _RTEMS_Lock_allocator( void )
+{
+ _API_Mutex_Lock( _RTEMS_Allocator_Mutex );
+}
+
+static inline void _RTEMS_Unlock_allocator( void )
+{
+ _API_Mutex_Unlock( _RTEMS_Allocator_Mutex );
+}
+
+static inline bool _RTEMS_Allocator_is_owner( void )
+{
+ return _API_Mutex_Is_owner( _RTEMS_Allocator_Mutex );
+}
+
+SCORE_EXTERN API_Mutex_Control *_Once_Mutex;
+
+static inline void _Once_Lock( void )
+{
+ _API_Mutex_Lock( _Once_Mutex );
+}
+
+static inline void _Once_Unlock( void )
+{
+ _API_Mutex_Unlock( _Once_Mutex );
+}
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */