forked from metin2/server
94 lines
2.1 KiB
C++
94 lines
2.1 KiB
C++
/*
|
|
* Filename: event.h
|
|
* Description: 이벤트 관련 (timed event)
|
|
*
|
|
* Author: 김한주 (aka. 비엽, Cronan), 송영진 (aka. myevan, 빗자루)
|
|
*/
|
|
#ifndef __INC_LIBTHECORE_EVENT_H__
|
|
#define __INC_LIBTHECORE_EVENT_H__
|
|
|
|
#include <boost/intrusive_ptr.hpp>
|
|
|
|
#ifdef M2_USE_POOL
|
|
#include "pool.h"
|
|
#endif
|
|
|
|
/**
|
|
* Base class for all event info data
|
|
*/
|
|
struct event_info_data
|
|
{
|
|
event_info_data() {}
|
|
virtual ~event_info_data() {}
|
|
|
|
#ifdef M2_USE_POOL
|
|
static void* operator new(size_t size) {
|
|
return pool_.Acquire(size);
|
|
}
|
|
static void operator delete(void* p, size_t size) {
|
|
pool_.Release(p, size);
|
|
}
|
|
private:
|
|
static MemoryPool pool_;
|
|
#endif
|
|
};
|
|
|
|
typedef struct event EVENT;
|
|
typedef boost::intrusive_ptr<EVENT> LPEVENT;
|
|
typedef int (*TEVENTFUNC) (LPEVENT event, int processing_time);
|
|
|
|
#define EVENTFUNC(name) int (name) (LPEVENT event, int processing_time)
|
|
#define EVENTINFO(name) struct name : public event_info_data
|
|
|
|
struct TQueueElement;
|
|
|
|
struct event
|
|
{
|
|
event() : func(NULL), info(NULL), q_el(NULL), ref_count(0) {}
|
|
~event() {
|
|
if (info != NULL) {
|
|
#ifdef M2_USE_POOL
|
|
delete info;
|
|
#else
|
|
M2_DELETE(info);
|
|
#endif
|
|
}
|
|
}
|
|
TEVENTFUNC func;
|
|
event_info_data* info;
|
|
TQueueElement * q_el;
|
|
char is_force_to_end;
|
|
char is_processing;
|
|
|
|
size_t ref_count;
|
|
};
|
|
|
|
extern void intrusive_ptr_add_ref(EVENT* p);
|
|
extern void intrusive_ptr_release(EVENT* p);
|
|
|
|
template<class T> // T should be a subclass of event_info_data
|
|
T* AllocEventInfo() {
|
|
#ifdef M2_USE_POOL
|
|
return new T;
|
|
#else
|
|
return M2_NEW T;
|
|
#endif
|
|
}
|
|
|
|
extern void event_destroy();
|
|
extern int event_process(int pulse);
|
|
extern int event_count();
|
|
|
|
#define event_create(func, info, when) event_create_ex(func, info, when)
|
|
extern LPEVENT event_create_ex(TEVENTFUNC func, event_info_data* info, int when);
|
|
extern void event_cancel(LPEVENT * event); // 이벤트 취소
|
|
extern int event_processing_time(LPEVENT event); // 수행 시간 리턴
|
|
extern int event_time(LPEVENT event); // 남은 시간 리턴
|
|
extern void event_reset_time(LPEVENT event, int when); // 실행 시간 재 설정
|
|
extern void event_set_verbose(int level);
|
|
|
|
extern event_info_data* FindEventInfo(DWORD dwID);
|
|
extern event_info_data* event_info(LPEVENT event);
|
|
|
|
#endif
|