⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qequeue.c

📁 这是状态机的一个框架结构的例子,可以作为状态机的基本架构
💻 C
字号:
/******************************************************************** 
 * Quantum Event-Queue implemenatation (C version)
 * Copyright (c) 2002 Miro Samek, Palo Alto, CA.
 * All Rights Reserved.
 *******************************************************************/
#include "qassert.h"
#include "port.h"

DEFINE_THIS_FILE;

/*.................................................................*/
QEQueue *QEQueueCtor(QEQueue *me, QEvent *qSto[], unsigned qLen) {
   if (!QF_EQUEUE_INIT(me)) {
      return 0;
   }
   me->start__ = &qSto[0];
   me->end__ = &qSto[qLen];    /* qLen is in units sizeof(Event *) */
   me->head__ = &qSto[0];
   me->tail__ = &qSto[0];
   me->nTot__ = qLen;
   me->nUsed__ = 0;
   me->nMax__ = 0;
   me->frontEvt__ = 0;             /* no events in the ring buffer */
   return me;
}
/*.................................................................*/
void QEQueueXtor(QEQueue *me) {
    QF_EQUEUE_CLEANUP(me); 
}
/*.................................................................*/
QEvent *QEQueueGet(QEQueue *me) {
   register QEvent *e;
   QF_PROTECT();
   if (me->frontEvt__ == 0) {               /* is the queue empty? */
      QF_EQUEUE_WAIT(me);     /* wait for event to arrive directly */
   }
   e = me->frontEvt__;
   if (me->nUsed__) {                         /* buffer not empty? */
      --me->nUsed__;          /* one less event in the ring-buffer */
      me->frontEvt__ = *me->tail__;  /* remove event from the tail */
      if (++me->tail__ == me->end__) {
         me->tail__ = me->start__;
      }
   }
   else {
      me->frontEvt__ = 0;                           /* queue empty */
      QF_EQUEUE_ONEMPTY(me);
   }
   QF_UNPROTECT();
   ENSURE(e);
   return e;
}
/*.................................................................*/
int QEQueuePutFIFO(QEQueue *me, QEvent *e) {
   REQUIRE(e);
   QF_PROTECT();
   if (me->frontEvt__ == 0) {               /* is the queue empty? */
      me->frontEvt__ = e;                /* deliver event directly */
      QF_EQUEUE_SIGNAL(me);/* unblock thread waiting on this queue */
   }
   else {    /* queue is not empty, leave event in the ring-buffer */
      if (me->nUsed__ < me->nTot__) {  /* can we accept the event? */
         if (++me->nUsed__ > me->nMax__) {   /* update # of events */
            me->nMax__ = me->nUsed__; /* store maximum used so far */
         }
         *me->head__ = e;   /* insert event into the buffer (FIFO) */
         if (++me->head__ == me->end__) {              
            me->head__ = me->start__;             /* wrap the head */
         }
         QF_UNPROTECT();
      }
      else {                               /* ring-buffer overflow */
         QF_UNPROTECT();
         return 0;                               /* return failure */
      }        
   }
   return !0;                                    /* retrun success */
}
/*.................................................................*/
int QEQueuePutLIFO(QEQueue *me, QEvent *e) {
   REQUIRE(e);
   QF_PROTECT();
   if (me->frontEvt__ == 0) {               /* is the queue empty? */
      me->frontEvt__ = e;                /* deliver event directly */
      QF_EQUEUE_SIGNAL(me);/* unblock thread waiting on this queue */
   }
   else {    /* queue is not empty, leave event in the ring-buffer */
      if (me->nUsed__ < me->nTot__) {  /* can we accept the event? */
         if (++me->nUsed__ > me->nMax__) {   /* update # of events */
            me->nMax__ = me->nUsed__; /* store maximum used so far */
         }
         if (--me->tail__ < me->start__) {
            me->tail__ = me->end__ - 1;           /* wrap the tail */
         }
         *me->tail__ = me->frontEvt__;
         me->frontEvt__ = e;                 /* put event to front */
         QF_UNPROTECT();
      }
      else {                               /* ring-buffer overflow */
         QF_UNPROTECT();
         return 0;                               /* return failure */
      }        
   }
   return !0;                                    /* retrun success */
}
/******************************************************************** 
 * NOTE01:
 * NOTE02:
 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -