aboutsummaryrefslogtreecommitdiffstats
path: root/os/common/oslib/include
diff options
context:
space:
mode:
authorGiovanni Di Sirio <gdisirio@gmail.com>2017-10-01 12:38:36 +0000
committerGiovanni Di Sirio <gdisirio@gmail.com>2017-10-01 12:38:36 +0000
commit76663a4a7916fd260779c5fecbb493009b59bb5a (patch)
tree8bd94fd9a1b193a2d9b4107f5744281c5a4e6c9f /os/common/oslib/include
parent6568f70bd826ba1b49c28d8709934fb5db18d0a3 (diff)
downloadChibiOS-76663a4a7916fd260779c5fecbb493009b59bb5a.tar.gz
ChibiOS-76663a4a7916fd260779c5fecbb493009b59bb5a.tar.bz2
ChibiOS-76663a4a7916fd260779c5fecbb493009b59bb5a.zip
Factory enhanced.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@10727 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/common/oslib/include')
-rw-r--r--os/common/oslib/include/chfactory.h67
1 files changed, 51 insertions, 16 deletions
diff --git a/os/common/oslib/include/chfactory.h b/os/common/oslib/include/chfactory.h
index 04a59a721..9dbcb7b57 100644
--- a/os/common/oslib/include/chfactory.h
+++ b/os/common/oslib/include/chfactory.h
@@ -48,11 +48,17 @@
#endif
/**
- * @brief Enables factory for generic objects.
- * @note Generic objects require the heap allocator.
+ * @brief Enables the registry of generic objects.
*/
-#if !defined(CH_CFG_FACTORY_GENERIC_BUFFER) || defined(__DOXYGEN__)
-#define CH_CFG_FACTORY_GENERIC_BUFFER TRUE
+#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) || defined(__DOXYGEN__)
+#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE
+#endif
+
+/**
+ * @brief Enables factory for generic buffers.
+ */
+#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) || defined(__DOXYGEN__)
+#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE
#endif
/**
@@ -70,7 +76,7 @@
((CH_CFG_FACTORY_SEMAPHORES == TRUE))
#define CH_FACTORY_REQUIRES_HEAP \
- ((CH_CFG_FACTORY_GENERIC_BUFFER == TRUE))
+ ((CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE))
#if (CH_CFG_FACTORY_MAX_NAMES_LENGHT < 0) || \
(CH_CFG_FACTORY_MAX_NAMES_LENGHT > 32)
@@ -123,17 +129,34 @@ typedef struct ch_dyn_list {
dyn_element_t *next;
} dyn_list_t;
-#if (CH_CFG_FACTORY_GENERIC_BUFFER == TRUE) || defined(__DOXIGEN__)
+#if (CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE) || defined(__DOXIGEN__)
/**
- * @brief Type of a dynamic semaphore.
+ * @brief Type of a registered object.
+ */
+typedef struct ch_registered_static_object {
+ /**
+ * @brief List element of the registered object.
+ */
+ dyn_element_t element;
+ /**
+ * @brief Pointer to the object.
+ * @note The type of the object is not stored in anyway.
+ */
+ void *objp;
+} registered_object_t;
+#endif
+
+#if (CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE) || defined(__DOXIGEN__)
+/**
+ * @brief Type of a dynamic buffer object.
*/
typedef struct ch_dyn_object {
/**
- * @brief List element of the dynamic object.
+ * @brief List element of the dynamic buffer object.
*/
dyn_element_t element;
/**
- * @brief Physical objects.
+ * @brief Physical buffer objects.
* @note This requires C99.
*/
uint8_t buffer[];
@@ -160,12 +183,20 @@ typedef struct ch_dyn_semaphore {
* @brief Type of the factory main object.
*/
typedef struct ch_objects_factory {
-#if (CH_CFG_FACTORY_GENERIC_BUFFER == TRUE) || defined(__DOXIGEN__)
/**
- * @brief List of the allocated objects.
+ * @brief List of the registered objects.
*/
dyn_list_t obj_list;
-#endif /* CH_CFG_FACTORY_GENERIC_BUFFER = TRUE */
+ /**
+ * @brief Pool of the available registered objects.
+ */
+ memory_pool_t obj_pool;
+#if (CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE) || defined(__DOXIGEN__)
+ /**
+ * @brief List of the allocated buffer objects.
+ */
+ dyn_list_t buf_list;
+#endif /* CH_CFG_FACTORY_GENERIC_BUFFERS = TRUE */
#if (CH_CFG_FACTORY_SEMAPHORES == TRUE) || defined(__DOXIGEN__)
/**
* @brief List of the allocated semaphores.
@@ -194,9 +225,13 @@ objects_factory_t ch_factory;
extern "C" {
#endif
void _factory_init(void);
-// dyn_registered_object_t *chFactoryRegisterObject(const char *name,
-// void *objp);
-#if (CH_CFG_FACTORY_GENERIC_BUFFER == TRUE) || defined(__DOXIGEN__)
+#if (CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE) || defined(__DOXIGEN__)
+ registered_object_t *chFactoryRegisterObject(const char *name,
+ void *objp);
+ registered_object_t *chFactoryFindObject(const char *name);
+ void chFactoryReleaseObject(registered_object_t *rop);
+#endif
+#if (CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE) || defined(__DOXIGEN__)
dyn_buffer_t *chFactoryCreateBuffer(const char *name, size_t size);
dyn_buffer_t *chFactoryFindBuffer(const char *name);
void chFactoryReleaseBuffer(dyn_buffer_t *dbp);
@@ -231,7 +266,7 @@ static inline dyn_element_t *chFactoryDuplicateReferenceI(dyn_element_t *dep) {
return dep;
}
-#if (CH_CFG_FACTORY_GENERIC_BUFFER == TRUE) || defined(__DOXIGEN__)
+#if (CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE) || defined(__DOXIGEN__)
/**
* @brief Returns the size of a generic dynamic buffer object.
*