|
QP/C
|
00001 /***************************************************************************** 00002 * Product: QF/C 00003 * Last Updated for Version: 4.4.00 00004 * Date of the Last Update: Jan 21, 2012 00005 * 00006 * Q u a n t u m L e a P s 00007 * --------------------------- 00008 * innovating embedded systems 00009 * 00010 * Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved. 00011 * 00012 * This software may be distributed and modified under the terms of the GNU 00013 * General Public License version 2 (GPL) as published by the Free Software 00014 * Foundation and appearing in the file GPL.TXT included in the packaging of 00015 * this file. Please note that GPL Section 2[b] requires that all works based 00016 * on this software must also be made publicly available under the terms of 00017 * the GPL ("Copyleft"). 00018 * 00019 * Alternatively, this software may be distributed and modified under the 00020 * terms of Quantum Leaps commercial licenses, which expressly supersede 00021 * the GPL and are specifically designed for licensees interested in 00022 * retaining the proprietary status of their code. 00023 * 00024 * Contact information: 00025 * Quantum Leaps Web site: http://www.quantum-leaps.com 00026 * e-mail: info@quantum-leaps.com 00027 *****************************************************************************/ 00028 #include "qf_pkg.h" 00029 #include "qassert.h" 00030 00031 Q_DEFINE_THIS_MODULE("qa_defer") 00032 00033 00039 /*..........................................................................*/ 00040 void QActive_defer(QActive *me, QEQueue *eq, QEvent const *e) { 00041 (void)me; /* avoid compiler warning about 'me' not used */ 00042 QEQueue_postFIFO(eq, e); 00043 } 00044 /*..........................................................................*/ 00045 uint8_t QActive_recall(QActive *me, QEQueue *eq) { 00046 QEvent const *e = QEQueue_get(eq); /* get an event from deferred queue */ 00047 uint8_t recalled; 00048 if (e != (QEvent const *)0) { /* event available? */ 00049 QF_CRIT_STAT_ 00050 00051 QActive_postLIFO(me, e); /* post it to the front of the AO's queue */ 00052 00053 QF_CRIT_ENTRY_(); 00054 00055 if (QF_EVT_POOL_ID_(e) != (uint8_t)0) { /* is it a dynamic event? */ 00056 00057 /* after posting to the AO's queue the event must be referenced 00058 * at least twice: once in the deferred event queue (eq->get() 00059 * did NOT decrement the reference counter) and once in the 00060 * AO's event queue. 00061 */ 00062 Q_ASSERT(QF_EVT_REF_CTR_(e) > (uint8_t)1); 00063 00064 /* we need to decrement the reference counter once, to account 00065 * for removing the event from the deferred event queue. 00066 */ 00067 QF_EVT_REF_CTR_DEC_(e); /* decrement the reference counter */ 00068 } 00069 00070 QF_CRIT_EXIT_(); 00071 recalled = (uint8_t)1; 00072 } 00073 else { 00074 recalled = (uint8_t)0; 00075 } 00076 return recalled; 00077 }
1.7.6.1