Forgot files...
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1560 35acf78f-673a-0410-8e92-d51de3d6d3f4master
parent
a5070b8e57
commit
ca20fd81f6
|
@ -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_ */
|
||||
|
||||
/** @} */
|
|
@ -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 */
|
||||
|
||||
/** @} */
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue