This commit is contained in:
Jacob Dufault 2017-03-03 00:43:54 -08:00
parent b3a544e880
commit 253414f29b
3 changed files with 24 additions and 29 deletions

View File

@ -96,7 +96,7 @@ indexer.exe --index-file /work2/chrome/src/chrome/foo.cc
*/ */
struct IpcMessage_IsAlive : public IpcMessage<IpcMessage_IsAlive> { struct IpcMessage_IsAlive : public BaseIpcMessage {
static IpcMessageId id; static IpcMessageId id;
}; };
@ -307,7 +307,7 @@ void main2() {
} }
int main(int argc, char** argv) { int main(int argc, char** argv) {
IpcMessage_IsAlive _; IpcRegistry::instance()->RegisterAllocator<IpcMessage_IsAlive>();
//main2(); //main2();
//return 0; //return 0;

14
ipc.cc
View File

@ -24,7 +24,12 @@ void JsonMessage::SetPayload(size_t payload_size, const char* payload) {
memcpy(payload_dest, payload, payload_size); memcpy(payload_dest, payload, payload_size);
} }
BaseIpcMessage::BaseIpcMessage(BaseIpcMessage::DoNotDeriveDirectly) {} BaseIpcMessage::BaseIpcMessage() {
assert(!runtime_id_.empty() && "Message is not registered using IpcRegistry::RegisterAllocator");
runtime_id = runtime_id_;
hashed_runtime_id = hashed_runtime_id_;
}
BaseIpcMessage::~BaseIpcMessage() {} BaseIpcMessage::~BaseIpcMessage() {}
@ -32,8 +37,11 @@ void BaseIpcMessage::Serialize(Writer& writer) {}
void BaseIpcMessage::Deserialize(Reader& reader) {} void BaseIpcMessage::Deserialize(Reader& reader) {}
IpcMessageId BaseIpcMessage::runtime_id_;
IpcRegistry IpcRegistry::Instance; int BaseIpcMessage::hashed_runtime_id_ = -1;
IpcRegistry* IpcRegistry::instance_ = nullptr;
std::unique_ptr<BaseIpcMessage> IpcRegistry::Allocate(int id) { std::unique_ptr<BaseIpcMessage> IpcRegistry::Allocate(int id) {
return std::unique_ptr<BaseIpcMessage>((*allocators)[id]()); return std::unique_ptr<BaseIpcMessage>((*allocators)[id]());
@ -108,7 +116,7 @@ std::vector<std::unique_ptr<BaseIpcMessage>> IpcDirectionalChannel::TakeMessages
char* message = local_block; char* message = local_block;
while (remaining_bytes > 0) { while (remaining_bytes > 0) {
std::unique_ptr<BaseIpcMessage> base_message = IpcRegistry::Instance.Allocate(as_message(message)->message_id); std::unique_ptr<BaseIpcMessage> base_message = IpcRegistry::instance()->Allocate(as_message(message)->message_id);
rapidjson::Document document; rapidjson::Document document;
document.Parse(as_message(message)->payload(), as_message(message)->payload_size); document.Parse(as_message(message)->payload(), as_message(message)->payload_size);

35
ipc.h
View File

@ -32,24 +32,24 @@ struct JsonMessage {
using IpcMessageId = std::string; using IpcMessageId = std::string;
struct BaseIpcMessage { struct BaseIpcMessage {
BaseIpcMessage();
virtual ~BaseIpcMessage(); virtual ~BaseIpcMessage();
virtual void Serialize(Writer& writer); virtual void Serialize(Writer& writer);
virtual void Deserialize(Reader& reader); virtual void Deserialize(Reader& reader);
IpcMessageId runtime_id; IpcMessageId runtime_id;
int hashed_runtime_id; int hashed_runtime_id = -1;
// Populated by IpcRegistry::RegisterAllocator.
static IpcMessageId runtime_id_;
static int hashed_runtime_id_;
/* /*
private: private:
template<typename T> template<typename T>
friend struct IpcMessage; friend struct IpcMessage;
*/ */
enum class DoNotDeriveDirectly {
DeriveFromIpcMessageInstead
};
BaseIpcMessage(DoNotDeriveDirectly);
}; };
struct IpcRegistry { struct IpcRegistry {
@ -66,7 +66,8 @@ struct IpcRegistry {
std::unique_ptr<BaseIpcMessage> Allocate(int id); std::unique_ptr<BaseIpcMessage> Allocate(int id);
static IpcRegistry* instance() { static IpcRegistry* instance() {
// TODO: Remove static magic. Just call register explicitly. if (!instance_)
instance_ = new IpcRegistry();
return instance_; return instance_;
} }
static IpcRegistry* instance_; static IpcRegistry* instance_;
@ -90,26 +91,12 @@ int IpcRegistry::RegisterAllocator() {
return new T(); return new T();
}; };
T::runtime_id_ = id;
T::hashed_runtime_id_ = hash;
return hash; return hash;
} }
template<typename TChild>
struct IpcMessage : public BaseIpcMessage {
IpcMessage();
static int hashed_id_;
};
template<typename TChild>
int IpcMessage<TChild>::hashed_id_ = IpcRegistry::Instance.RegisterAllocator<TChild>();
template<typename TChild>
IpcMessage<TChild>::IpcMessage()
: BaseIpcMessage(DoNotDeriveDirectly::DeriveFromIpcMessageInstead) {
runtime_id = TChild::id;
hashed_runtime_id = hashed_id_;
}