eventInfo
是對消息的抽象誊辉,根據(jù)不同的應(yīng)用場景贸呢,event庫提供了三種類型的消息:
-
SimpleEventInfo
: 只有一個(gè)消息號胜卤,沒有消息內(nèi)容椭坚,相當(dāng)于一個(gè)信號媚媒。 -
ScatteredEventInfo
:有消息號锄码,有消息內(nèi)容,但是消息長度為無效值咪鲜,沒看懂有啥用狐赡。 -
ConsecutiveEventInfo
:既有消息號,又有消息內(nèi)容的消息疟丙。消息內(nèi)容既可以是一個(gè)結(jié)構(gòu)體颖侄,也可以是一個(gè)內(nèi)存緩沖區(qū)。
EventInfo
是一個(gè)接口:
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
提取了公共代碼享郊,因?yàn)槊總€(gè)事件都有事件號(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
這個(gè)概念览祖,Event
提供了一個(gè)轉(zhuǎn)換構(gòu)造函數(shù):
struct Event
{
Event();
Event(const EventInfo& info); // 轉(zhuǎn)換構(gòu)造函數(shù)
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;
};