QP/C
qa_defer.c
Go to the documentation of this file.
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 }