History

First draft for entity script server log streaming

Atlante45 committed 9 years ago

Commit fcb74bc1 parent 74f10a17 files · +155 −12Browse files

Showing the changes to assignment-client/src/scripts/EntityScriptServer.cpp (1 of 7 files). Show all

Unified · Split

assignment-client/src/scripts/EntityScriptServer.cpp+107−8
@@ -27,9 +27,30 @@ · 26 unmodified lines
2727 #include "ClientServerUtils.h"
2828 #include "../entities/AssignmentParentFinder.h"
2929
30+
31+#include <LogHandler.h>
32+#include <mutex>
33+
34+using Mutex = std::mutex;
35+using Lock = std::lock_guard<Mutex>;
36+
37+static std::mutex logBufferMutex;
38+static std::string logBuffer;
39+
40+void messageHandler(QtMsgType type, const QMessageLogContext& context, const QString& message) {
41+ auto logMessage = LogHandler::getInstance().printMessage((LogMsgType) type, context, message);
42+
43+ if (!logMessage.isEmpty()) {
44+ Lock lock(logBufferMutex);
45+ logBuffer.append(logMessage.toStdString() + '\n');
46+ }
47+}
48+
3049 int EntityScriptServer::_entitiesScriptEngineCount = 0;
3150
3251 EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssignment(message) {
52+ qInstallMessageHandler(messageHandler);
53+
3354 DependencyManager::get<EntityScriptingInterface>()->setPacketSender(&_entityEditSender);
3455
3556 ResourceManager::init();
@@ -57,6 +78,18 @@ EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssig · 21 unmodified lines
5778
5879 packetReceiver.registerListener(PacketType::ReloadEntityServerScript, this, "handleReloadEntityServerScriptPacket");
5980 packetReceiver.registerListener(PacketType::EntityScriptGetStatus, this, "handleEntityScriptGetStatusPacket");
81+ packetReceiver.registerListener(PacketType::EntityServerScriptLog, this, "handleEntityServerScriptLogPacket");
82+
83+ static const int LOG_INTERVAL = MSECS_PER_SECOND / 50;
84+ auto timer = new QTimer(this);
85+ timer->setTimerType(Qt::PreciseTimer);
86+ timer->setInterval(LOG_INTERVAL);
87+ connect(timer, &QTimer::timeout, this, &EntityScriptServer::pushLogs);
88+ timer->start();
89+}
90+
91+EntityScriptServer::~EntityScriptServer() {
92+ qInstallMessageHandler(LogHandler::verboseMessageHandler);
6093 }
6194
6295 static const QString ENTITY_SCRIPT_SERVER_LOGGING_NAME = "entity-script-server";
@@ -146,6 +179,60 @@ void EntityScriptServer::updateEntityPPS() { · 83 unmodified lines
146179 qDebug() << QString("Updating entity PPS to: %1 @ %2 PPS per script = %3 PPS").arg(numRunningScripts).arg(_entityPPSPerScript).arg(pps);
147180 }
148181
182+void EntityScriptServer::handleEntityServerScriptLogPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
183+ // These are temporary checks until we can ensure that nodes eventually disconnect if the Domain Server stops telling them
184+ // about each other.
185+ if (senderNode->getCanRez() || senderNode->getCanRezTmp()) {
186+ bool enable = false;
187+ message->readPrimitive(&enable);
188+ qInfo() << "======== Got log packet:" << enable;
189+
190+ if (enable) {
191+ _logListeners.insert(senderNode->getUUID());
192+ } else {
193+ _logListeners.erase(senderNode->getUUID());
194+ }
195+ }
196+}
197+
198+void EntityScriptServer::pushLogs() {
199+ std::string buffer;
200+ {
201+ Lock lock(logBufferMutex);
202+ std::swap(logBuffer, buffer);
203+ }
204+
205+ if (buffer.empty()) {
206+ return;
207+ }
208+ if (_logListeners.empty()) {
209+ return;
210+ }
211+
212+ auto packet = NLPacket::create(PacketType::EntityServerScriptLog, buffer.size(), true);
213+ packet->write(buffer.data(), buffer.size());
214+
215+ auto nodeList = DependencyManager::get<NodeList>();
216+
217+ auto last = --std::end(_logListeners);
218+ for (auto it = std::begin(_logListeners); it != last; ++it) {
219+ auto node = nodeList->nodeWithUUID(*it);
220+ if (node && node->getActiveSocket()) {
221+ auto copy = NLPacket::createCopy(*packet);
222+ nodeList->sendPacket(std::move(copy), *node);
223+ } else {
224+ qWarning() << "Node not found";
225+ }
226+ }
227+
228+ auto node = nodeList->nodeWithUUID(*last);
229+ if (node && node->getActiveSocket()) {
230+ nodeList->sendPacket(std::move(packet), *node);
231+ } else {
232+ qWarning() << "Node not found";
233+ }
234+}
235+
149236 void EntityScriptServer::run() {
150237 // make sure we request our script once the agent connects to the domain
151238 auto nodeList = DependencyManager::get<NodeList>();
@@ -347,15 +434,27 @@ void EntityScriptServer::checkAndCallPreload(const EntityItemID& entityID, const · 195 unmodified lines
347434 }
348435
349436 void EntityScriptServer::nodeKilled(SharedNodePointer killedNode) {
350− if (!_shuttingDown && killedNode->getType() == NodeType::EntityServer) {
351− if (_entitiesScriptEngine) {
352− _entitiesScriptEngine->unloadAllEntityScripts();
353− _entitiesScriptEngine->stop();
437+ switch (killedNode->getType()) {
438+ case NodeType::EntityServer: {
439+ if (!_shuttingDown) {
440+ if (_entitiesScriptEngine) {
441+ _entitiesScriptEngine->unloadAllEntityScripts();
442+ _entitiesScriptEngine->stop();
443+ }
444+
445+ resetEntitiesScriptEngine();
446+
447+ _entityViewer.clear();
448+ }
449+ break;
354450 }
355−
356− resetEntitiesScriptEngine();
357−
358− _entityViewer.clear();
451+ case NodeType::Agent: {
452+ _logListeners.erase(killedNode->getUUID());
453+ break;
454+ }
455+ default:
456+ // Do nothing
457+ break;
359458 }
360459 }
361460