eventInfo
是对消息的抽象,根据不同的应用场景,event库提供了三种类型的消息:
-
SimpleEventInfo
: 只有一个消息号,没有消息内容,相当于一个信号。 -
ScatteredEventInfo
:有消息号,有消息内容,但是消息长度为无效值,没看懂有啥用。 -
ConsecutiveEventInfo
:既有消息号,又有消息内容的消息。消息内容既可以是一个结构体,也可以是一个内存缓冲区。
EventInfo
是一个接口:
DEFINE_ROLE(EventInfo)
{
ABSTRACT(EventId getEventId() const);
ABSTRACT(const void* getMsg() const);
ABSTRACT(size_t getMsgSize() const);
ABSTRACT(cub::Status updateEventId(const EventId) const);
};
BaseEventInfo
提取了公共代码,因为每个事件都有事件号(eventId
):
struct BaseEventInfo : EventInfo
{
explicit BaseEventInfo(const EventId eventId);
OVERRIDE(EventId getEventId() const);
OVERRIDE(cub::Status updateEventId(const EventId id) const);
private:
mutable EventId eventId;
};
在Transaction DSL中我们依赖的是Event
这个概念,Event
提供了一个转换构造函数:
struct Event
{
Event();
Event(const EventInfo& info); // 转换构造函数
EventId getEventId() const;
const void* getMsg() const;
size_t getMsgSize() const;
bool matches(const EventId eventId) const;
cub::Status updateEventId(const EventId) const;
void assignEventInfoTo(Event&) const;
const EventInfo& getEventInfo() const
{
return *info;
}
void consume() const;
bool isConsumed() const;
private:
const EventInfo* info;
mutable bool consumed;
};