The old event queue demo has a few bugs. I revised them. The following is new version.
// evt.cpp
#include <time.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define SIG_ABRT 1
#define SIG_STOP 2
#define SIG_KILL 3
#define SIG_CHLD 4
#define SIG_MAX 5
struct _EvtEntry {
int event;
struct _EvtEntry *next;
};
typedef struct _EvtEntry EvtEntry;
class EvtQueue {
private:
int event_cnt; // the count events.
EvtEntry *head;
EvtEntry *tail;
public:
EvtQueue();
~EvtQueue();
void AppendEvt(int evt);
void AddEvt(int evt);
int RemoveEvt();
int getEvtCnt();
};
EvtQueue::EvtQueue(){
event_cnt = 0;
head = NULL;
tail = NULL;
}
EvtQueue::~EvtQueue() {
if (event_cnt > 0) {
int cnt = event_cnt;
for (int i = 0; i < cnt; i++)
RemoveEvt();
head = NULL;
tail = NULL;
event_cnt = 0;
}
}
void EvtQueue::AppendEvt(int evt) {
EvtEntry *pEvt = new EvtEntry();
if (pEvt) {
// initialization
pEvt->event = evt;
pEvt->next = NULL;
// append to the event queue
// empty queue
if (!head && !tail) {
head = pEvt;
tail = pEvt;
}
else
tail->next = pEvt;
event_cnt++;
}
}
void EvtQueue::AddEvt(int evt) {
// search the event if exist
for (EvtEntry *p = head; p; p = p->next) {
if (p->event = evt)
break;
}
// no found
if (!p) {
EvtEntry *pEvt = new EvtEntry();
if (pEvt) {
// initialization
pEvt->event = evt;
pEvt->next = NULL;
// append to the event queue
// empty queue
if (!head && !tail) {
head = pEvt;
tail = pEvt;
}
else
tail->next = pEvt;
event_cnt++;
}
}
}
int EvtQueue::RemoveEvt() {
int evt = 0;
EvtEntry *pEvt = NULL;
// get an event
if (head){
pEvt = head;
head = head->next;
event_cnt--;
evt = pEvt->event;
delete pEvt;
}
return evt;
}
int EvtQueue::getEvtCnt() {
return event_cnt;
}
char* sig_msg(int evt) {
static char *msg[SIG_MAX] = {
"signal abort",
"signal stop",
"signal kill",
"signal child",
"unknown signal"
};
evt--;
if ((evt >= 0) && (evt < SIG_MAX))
return msg[evt];
else
return msg[SIG_MAX - 1];
}
// Global
int getRand(float m) {
int ret = 0;
srand((int)time(0));
while (true) {
ret = (int) (m * rand() / (RAND_MAX + 1.0));
if ((ret > 0) && (ret <=(int)m))
return ret;
}
}
//main
int main() {
EvtQueue evtQue;
for (int i = 0; i < SIG_MAX; i++) {
evtQue.AppendEvt(getRand(SIG_MAX));
}
for (int n = 0; n < SIG_MAX; n++) {
int evt = evtQue.RemoveEvt();
cout<<sig_msg(evt)<<endl;
}
return 0;
}
2009 March 12th Thursday (三月 十二日 木曜日)
最新推荐文章于 2020-12-17 19:32:26 发布