Dining Philosophers Problem (DPP) example for the QP active object framework. Demonstrates: event-driven programming, hierarchical state machines in C++, modeling and graphical state machine design, code generation, preemptive multitasking, software tracing, power saving mode, direct event posting, publish-subscribe. More information available in the [[/users/QL/notebook|Quantum Leaps Notebook pages]]. See also [[http://www.state-machine.com|state-machine.com]].

Dependencies:   mbed qp

Revision:
4:6189d844a1a2
Parent:
3:81ceb3127876
--- a/main.cpp	Mon Sep 26 02:21:01 2011 +0000
+++ b/main.cpp	Tue Sep 04 22:41:20 2012 +0000
@@ -1,78 +1,81 @@
 //////////////////////////////////////////////////////////////////////////////
 // Product: DPP example
-// Last Updated for Version: 4.2.00
-// Date of the Last Update:  Jul 23, 2011
+// Last Updated for Version: 4.5.02
+// Date of the Last Update:  Aug 11, 2012
 //
 //                    Q u a n t u m     L e a P s
 //                    ---------------------------
 //                    innovating embedded systems
 //
-// Copyright (C) 2002-2011 Quantum Leaps, LLC. All rights reserved.
+// Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
+//
+// This program is open source 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 2 of the License, or
+// (at your option) any later version.
 //
-// This software may be distributed and modified under the terms of the GNU
-// General Public License version 2 (GPL) as published by the Free Software
-// Foundation and appearing in the file GPL.TXT included in the packaging of
-// this file. Please note that GPL Section 2[b] requires that all works based
-// on this software must also be made publicly available under the terms of
-// the GPL ("Copyleft").
+// Alternatively, this program may be distributed and modified under the
+// terms of Quantum Leaps commercial licenses, which expressly supersede
+// the GNU General Public License and are specifically designed for
+// licensees interested in retaining the proprietary status of their code.
 //
-// Alternatively, this software may be distributed and modified under the
-// terms of Quantum Leaps commercial licenses, which expressly supersede
-// the GPL and are specifically designed for licensees interested in
-// retaining the proprietary status of their code.
+// This program 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/>.
 //
 // Contact information:
-// Quantum Leaps Web site:  http://www.quantum-leaps.com
+// Quantum Leaps Web sites: http://www.quantum-leaps.com
+//                          http://www.state-machine.com
 // e-mail:                  info@quantum-leaps.com
 //////////////////////////////////////////////////////////////////////////////
 #include "qp_port.h"
 #include "dpp.h"
 #include "bsp.h"
 
-// Local-scope objects -------------------------------------------------------
-static QEvent const *l_tableQueueSto[N_PHILO];
-static QEvent const *l_philoQueueSto[N_PHILO][N_PHILO];
-static QSubscrList   l_subscrSto[MAX_PUB_SIG];
-
-static union SmallEvents {
-    void   *e0;                                          // minimum event size
-    uint8_t e1[sizeof(TableEvt)];
-    // ... other event types to go into this pool
-} l_smlPoolSto[2*N_PHILO];                 // storage for the small event pool
+namespace DPP {
 
 //............................................................................
-int main() {
+extern "C" int_t main(void) {
+    static QP::QEvt const *tableQueueSto[N_PHILO];
+    static QP::QEvt const *philoQueueSto[N_PHILO][N_PHILO];
+    static QP::QSubscrList   subscrSto[MAX_PUB_SIG];
+    static QF_MPOOL_EL(TableEvt) smlPoolSto[2U*N_PHILO];         // small pool
+
+    QP::QF::init();   // initialize the framework and the underlying RT kernel
 
     BSP_init();                                          // initialize the BSP
 
-    QF::init();       // initialize the framework and the underlying RT kernel
+                                                     // object dictionaries...
+    QS_OBJ_DICTIONARY(smlPoolSto);
+    QS_OBJ_DICTIONARY(tableQueueSto);
+    QS_OBJ_DICTIONARY(philoQueueSto[0]);
+    QS_OBJ_DICTIONARY(philoQueueSto[1]);
+    QS_OBJ_DICTIONARY(philoQueueSto[2]);
+    QS_OBJ_DICTIONARY(philoQueueSto[3]);
+    QS_OBJ_DICTIONARY(philoQueueSto[4]);
 
-                                                     // object dictionaries...
-    QS_OBJ_DICTIONARY(l_smlPoolSto);
-    QS_OBJ_DICTIONARY(l_tableQueueSto);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[0]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[1]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[2]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[3]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[4]);
-
-    QF::psInit(l_subscrSto, Q_DIM(l_subscrSto));     // init publish-subscribe
+    QP::QF::psInit(&subscrSto[0], Q_DIM(subscrSto)); // init publish-subscribe
 
                                                   // initialize event pools...
-    QF::poolInit(l_smlPoolSto, sizeof(l_smlPoolSto), sizeof(l_smlPoolSto[0]));
+    QP::QF::poolInit(&smlPoolSto[0], sizeof(smlPoolSto),
+                                     sizeof(smlPoolSto[0]));
 
                                                 // start the active objects...
-    uint8_t n;
-    for (n = 0; n < N_PHILO; ++n) {
-        AO_Philo[n]->start((uint8_t)(n + 1),
-                           l_philoQueueSto[n], Q_DIM(l_philoQueueSto[n]),
-                           (void *)0, 0, (QEvent *)0);
+    for (uint8_t n = 0U; n < N_PHILO; ++n) {
+        AO_Philo[n]->start(static_cast<uint8_t>(n + 1U),
+                           &philoQueueSto[n][0], Q_DIM(philoQueueSto[n]),
+                           static_cast<void *>(0), 0U);
     }
-    AO_Table->start((uint8_t)(N_PHILO + 1),
-                    l_tableQueueSto, Q_DIM(l_tableQueueSto),
-                    (void *)0, 0, (QEvent *)0);
+    AO_Table->start(static_cast<uint8_t>(N_PHILO + 1U),
+                    &tableQueueSto[0], Q_DIM(tableQueueSto),
+                    static_cast<void *>(0), 0U);
+
 
-    QF::run();                                       // run the QF application
+    return QP::QF::run();                            // run the QF application
+}
 
-    return 0;
-}
+}                                                             // namespace DPP