aboutsummaryrefslogtreecommitdiffstats
path: root/os/rt
diff options
context:
space:
mode:
Diffstat (limited to 'os/rt')
-rw-r--r--os/rt/include/chregistry.h1
-rw-r--r--os/rt/src/chregistry.c27
2 files changed, 28 insertions, 0 deletions
diff --git a/os/rt/include/chregistry.h b/os/rt/include/chregistry.h
index a786e93a0..f60b1b2c3 100644
--- a/os/rt/include/chregistry.h
+++ b/os/rt/include/chregistry.h
@@ -110,6 +110,7 @@ extern "C" {
thread_t *chRegNextThread(thread_t *tp);
thread_t *chRegFindThreadByName(const char *name);
thread_t *chRegFindThreadByPointer(thread_t *tp);
+ thread_t *chRegFindThreadByWorkingArea(stkalign_t *wa);
#ifdef __cplusplus
}
#endif
diff --git a/os/rt/src/chregistry.c b/os/rt/src/chregistry.c
index ec90b4168..24246c012 100644
--- a/os/rt/src/chregistry.c
+++ b/os/rt/src/chregistry.c
@@ -233,6 +233,33 @@ thread_t *chRegFindThreadByPointer(thread_t *tp) {
return NULL;
}
+/**
+ * @brief Confirms that a working area is being used by some active thread.
+ * @note The reference counter of the found thread is increased by one so
+ * it cannot be disposed incidentally after the pointer has been
+ * returned.
+ *
+ * @param[in] wa pointer to a static working area
+ * @return A pointer to the found thread.
+ * @retval NULL if a matching thread has not been found.
+ *
+ * @api
+ */
+thread_t *chRegFindThreadByWorkingArea(stkalign_t *wa) {
+ thread_t *ctp;
+
+ /* Scanning registry.*/
+ ctp = chRegFirstThread();
+ do {
+ if (ctp->stklimit == wa) {
+ return ctp;
+ }
+ ctp = chRegNextThread(ctp);
+ } while (ctp != NULL);
+
+ return NULL;
+}
+
#endif /* CH_CFG_USE_REGISTRY == TRUE */
/** @} */