aboutsummaryrefslogtreecommitdiffstats
path: root/os
diff options
context:
space:
mode:
authorGiovanni Di Sirio <gdisirio@gmail.com>2017-12-20 09:08:50 +0000
committerGiovanni Di Sirio <gdisirio@gmail.com>2017-12-20 09:08:50 +0000
commit8a0fc7278351b559652837149fb067131262a093 (patch)
tree9c460a64c5dd55e861234daddbfd35d39e444d32 /os
parentb2ac0d4dc5999aea112158e7d2f66f5ab56cf0af (diff)
downloadChibiOS-8a0fc7278351b559652837149fb067131262a093.tar.gz
ChibiOS-8a0fc7278351b559652837149fb067131262a093.tar.bz2
ChibiOS-8a0fc7278351b559652837149fb067131262a093.zip
Added new API function to factory.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11149 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os')
-rw-r--r--os/common/oslib/include/chfactory.h1
-rw-r--r--os/common/oslib/src/chfactory.c31
2 files changed, 32 insertions, 0 deletions
diff --git a/os/common/oslib/include/chfactory.h b/os/common/oslib/include/chfactory.h
index ca242171d..1ff6d1dff 100644
--- a/os/common/oslib/include/chfactory.h
+++ b/os/common/oslib/include/chfactory.h
@@ -325,6 +325,7 @@ extern "C" {
registered_object_t *chFactoryRegisterObject(const char *name,
void *objp);
registered_object_t *chFactoryFindObject(const char *name);
+ registered_object_t *chFactoryFindObjectByPointer(void *objp);
void chFactoryReleaseObject(registered_object_t *rop);
#endif
#if (CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE) || defined(__DOXYGEN__)
diff --git a/os/common/oslib/src/chfactory.c b/os/common/oslib/src/chfactory.c
index 5d1d6091e..5067a016c 100644
--- a/os/common/oslib/src/chfactory.c
+++ b/os/common/oslib/src/chfactory.c
@@ -327,6 +327,37 @@ registered_object_t *chFactoryFindObject(const char *name) {
}
/**
+ * @brief Retrieves a registered object by pointer.
+ * @post A reference to the registered object is returned with the
+ * reference counter increased by one.
+ *
+ * @param[in] objp pointer to the object to be retrieved
+ *
+ * @return The reference to the found registered object.
+ * @retval NULL if a registered object with the specified name
+ * does not exist.
+ *
+ * @api
+ */
+registered_object_t *chFactoryFindObjectByPointer(void *objp) {
+ registered_object_t *rop = (registered_object_t *)ch_factory.obj_list.next;
+
+ F_LOCK();
+
+ while ((void *)rop != (void *)&ch_factory.obj_list) {
+ if (rop->objp == objp) {
+ rop->element.refs++;
+ return rop;
+ }
+ rop = (registered_object_t *)rop->element.next;
+ }
+
+ F_UNLOCK();
+
+ return NULL;
+}
+
+/**
* @brief Releases a registered object.
* @details The reference counter of the registered object is decreased
* by one, if reaches zero then the registered object memory