diff --git a/src/autonet/AutoNetServer.cpp b/src/autonet/AutoNetServer.cpp index ad7b56e82..6ef702b5f 100644 --- a/src/autonet/AutoNetServer.cpp +++ b/src/autonet/AutoNetServer.cpp @@ -7,6 +7,26 @@ #include #include FUTURE_HEADER +// +// Demangle type names on mac and linux. +// Just returns type_info.name() on windows +// +#if __GNUG__ +#include +static std::string demangle(const std::type_info& ti) { + int status; + std::unique_ptr res { + abi::__cxa_demangle(ti.name(), nullptr, nullptr, &status), + std::free + }; + return std::string(status == 0 ? res.get() : ti.name()); +} +#else +static std::string demangle(const std::type_info& ti) { + return std::string(ti.name()); +} +#endif + using std::placeholders::_1; using std::placeholders::_2; using json11::Json; @@ -16,8 +36,11 @@ AutoNetServer::AutoNetServer(): m_Server(std::make_shared()), m_Port(8000) { - // Register handlers and configure websocketpp + // Configure websocketpp m_Server->init_asio(); + m_Server->set_access_channels(websocketpp::log::alevel::none); + + // Register handlers m_Server->set_open_handler(std::bind(&AutoNetServer::OnOpen, this, ::_1)); m_Server->set_close_handler(std::bind(&AutoNetServer::OnClose, this, ::_1)); m_Server->set_message_handler(std::bind(&AutoNetServer::OnMessage, this, ::_1, ::_2)); @@ -25,7 +48,7 @@ AutoNetServer::AutoNetServer(): // Generate list of all types from type registry for (auto type = g_pFirstTypeEntry; type; type = type->pFlink) if (type->CanInject()) - m_AllTypes[type->ti.name()] = [type]{ type->Inject(); }; + m_AllTypes[demangle(type->ti)] = [type]{ type->Inject(); }; // Generate list of all events from event registry for (auto event = g_pFirstEventEntry; event; event = event->pFlink) @@ -111,7 +134,7 @@ void AutoNetServer::NewContext(CoreContext& newCtxt){ *this += [this, ctxt] { Json::object context { - {"name", ctxt->GetSigilType().name()} + {"name", demangle(ctxt->GetSigilType())} }; if (ctxt->GetParentContext()){ @@ -138,12 +161,12 @@ void AutoNetServer::NewObject(CoreContext& ctxt, const AnySharedPointer& object) std::shared_ptr objectPtr(*object); // Add object data - objData["name"] = typeid(*objectPtr).name(); + objData["name"] = demangle(typeid(*objectPtr)); { Json::array slots; for (auto slot = object->GetSlotInformation().pHead; slot; slot = slot->pFlink) { slots.push_back(Json::object{ - {"name", slot->type.name()}, + {"name", demangle(slot->type)}, {"autoRequired", slot->autoRequired}, {"offset", int(slot->slotOffset)} }); @@ -178,7 +201,7 @@ void AutoNetServer::NewObject(CoreContext& ctxt, const AnySharedPointer& object) Json::array listenerTypes; for (auto& event : m_EventTypes) { if (event->IsSameAs(objectPtr.get())) - listenerTypes.push_back(event->Type().name()); + listenerTypes.push_back(demangle(event->Type())); } if (!listenerTypes.empty()) @@ -194,7 +217,7 @@ void AutoNetServer::NewObject(CoreContext& ctxt, const AnySharedPointer& object) if (bolt) { Json::array sigils; for(auto cur = bolt->GetContextSigils(); *cur; cur++){ - sigils.push_back((*cur)->name()); + sigils.push_back(demangle(**cur)); } types["bolt"] = sigils; } @@ -205,7 +228,7 @@ void AutoNetServer::NewObject(CoreContext& ctxt, const AnySharedPointer& object) void AutoNetServer::EventFired(CoreContext& context, const std::type_info& info){ int contextID = ResolveContextID(&context); - std::string name = info.name(); + std::string name = demangle(info); *this += [this, contextID, name] { BroadcastMessage("eventFired", contextID, Json::object{{"name", name}}); @@ -299,7 +322,7 @@ void AutoNetServer::PollThreadUtilization(std::chrono::milliseconds period){ // Broadcast current thread utilization int contextID = ResolveContextID(thread->GetContext().get()); - std::string name = typeid(*thread.get()).name(); + std::string name = demangle(typeid(*thread.get())); std::chrono::duration periodDbl = period; double kmPercent = 100.0 * (deltaRuntimeKM.count() / periodDbl.count());