2009 March 12th Thursday (三月 十二日 木曜日)

来源:互联网 发布:ntfs for mac 破解版 编辑:程序博客网 时间:2024/05/11 10:15

   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;
}

原创粉丝点击