Forgot files...

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1560 35acf78f-673a-0410-8e92-d51de3d6d3f4
master
gdisirio 2010-02-02 21:27:53 +00:00
parent a5070b8e57
commit ca20fd81f6
3 changed files with 142 additions and 1 deletions

View File

@ -0,0 +1,64 @@
/*
ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
ChibiOS/RT is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/RT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file registry.h
* @brief Threads registry macros and structures.
* @addtogroup registry
* @{
*/
#ifndef _REGISTRY_H_
#define _REGISTRY_H_
#if CH_USE_REGISTRY
/**
* @brief Removes a thread from the registry list.
* @note This macro is not meant for use in application code.
*/
#define REG_REMOVE(tp) { \
(tp)->p_older->p_newer = (tp)->p_newer; \
(tp)->p_newer->p_older = (tp)->p_older; \
}
/**
* @brief Adds a thread to the registry list.
* @note This macro is not meant for use in application code.
*/
#define REG_INSERT(tp) { \
(tp)->p_newer = (Thread *)&rlist; \
(tp)->p_older = rlist.p_older; \
(tp)->p_older->p_newer = rlist.p_older = (tp); \
}
#ifdef __cplusplus
extern "C" {
#endif
Thread *chRegFirstThread(void);
Thread *chRegNextThread(Thread *tp);
#ifdef __cplusplus
}
#endif
#endif /* CH_USE_REGISTRY */
#endif /* _REGISTRY_H_ */
/** @} */

View File

@ -0,0 +1,77 @@
/*
ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
ChibiOS/RT is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/RT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file chregistry.c
* @brief Threads registry code.
* @addtogroup registry
* @{
*/
#include "ch.h"
#if CH_USE_REGISTRY
/**
* @brief Returns the first thread in the system.
* @details Returns the most ancient thread in the system, usually this is
* the main thread unless it terminated.
* @note A reference is added to the returned thread in order to make sure
* it status is not lost.
*
* @return A reference to the first thread.
*/
Thread *chRegFirstThread(void) {
Thread *tp;
chSysLock();
(tp = rlist.p_newer)->p_refs++;
chSysUnlock();
return tp;
}
/**
* @brief Returns the thread next to the specified one.
* @details The reference counter of the specified thread is decremented and
* the reference counter of the returned thread is incremented.
*
* @param[in] tp pointer to the thread
* @return A reference to the next thread.
* @retval NULL if there is no next thread.
*/
Thread *chRegNextThread(Thread *tp) {
chSysLock();
chDbgAssert(tp->p_refs > 0, "chRegNextThread(), #1",
"not referenced");
tp->p_refs--;
if (tp->p_newer != (Thread *)&rlist) {
tp = tp->p_newer;
chDbgAssert(tp->p_refs < 255, "chRegNextThread(), #2",
"too many references");
tp->p_refs++;
}
else
tp = NULL;
chSysUnlock();
return tp;
}
#endif /* CH_USE_REGISTRY */
/** @} */

View File

@ -55,7 +55,7 @@
- FIX: Fixed wrong notes on function chThdResume() (bug 2943160).
- NEW: Implemented the concept of thread references, this mechanism ensures
that a dynamic thread's memory is not freed while some other thread still
owns a pointer to the thread. Static threads are not affected by the new
owns a reference to the thread. Static threads are not affected by the new
mechanism. Two new APIs have been added: chThdAddRef() and chThdRelease().
- NEW: Not more than one thread can be waiting in chThdWait() as long they
own a reference.