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
27#include "ClientServerUtils.h"27#include "ClientServerUtils.h"
28#include "../entities/AssignmentParentFinder.h"28#include "../entities/AssignmentParentFinder.h"
29 29
30
31#include <LogHandler.h>
32#include <mutex>
33
34using Mutex = std::mutex;
35using Lock = std::lock_guard<Mutex>;
36
37static std::mutex logBufferMutex;
38static std::string logBuffer;
39
40void 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
30int EntityScriptServer::_entitiesScriptEngineCount = 0;49int EntityScriptServer::_entitiesScriptEngineCount = 0;
31 50
32EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssignment(message) {51EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssignment(message) {
52 qInstallMessageHandler(messageHandler);
53
33 DependencyManager::get<EntityScriptingInterface>()->setPacketSender(&_entityEditSender);54 DependencyManager::get<EntityScriptingInterface>()->setPacketSender(&_entityEditSender);
34 55
35 ResourceManager::init();56 ResourceManager::init();
@@ -57,6 +78,18 @@ EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssig · 21 unmodified lines
57 78
58 packetReceiver.registerListener(PacketType::ReloadEntityServerScript, this, "handleReloadEntityServerScriptPacket");79 packetReceiver.registerListener(PacketType::ReloadEntityServerScript, this, "handleReloadEntityServerScriptPacket");
59 packetReceiver.registerListener(PacketType::EntityScriptGetStatus, this, "handleEntityScriptGetStatusPacket");80 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
91EntityScriptServer::~EntityScriptServer() {
92 qInstallMessageHandler(LogHandler::verboseMessageHandler);
60}93}
61 94
62static const QString ENTITY_SCRIPT_SERVER_LOGGING_NAME = "entity-script-server";95static const QString ENTITY_SCRIPT_SERVER_LOGGING_NAME = "entity-script-server";
@@ -146,6 +179,60 @@ void EntityScriptServer::updateEntityPPS() { · 83 unmodified lines
146 qDebug() << QString("Updating entity PPS to: %1 @ %2 PPS per script = %3 PPS").arg(numRunningScripts).arg(_entityPPSPerScript).arg(pps);179 qDebug() << QString("Updating entity PPS to: %1 @ %2 PPS per script = %3 PPS").arg(numRunningScripts).arg(_entityPPSPerScript).arg(pps);
147}180}
148 181
182void 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
198void 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
149void EntityScriptServer::run() {236void EntityScriptServer::run() {
150 // make sure we request our script once the agent connects to the domain237 // make sure we request our script once the agent connects to the domain
151 auto nodeList = DependencyManager::get<NodeList>();238 auto nodeList = DependencyManager::get<NodeList>();
@@ -347,15 +434,27 @@ void EntityScriptServer::checkAndCallPreload(const EntityItemID& entityID, const · 195 unmodified lines
347}434}
348 435
349void EntityScriptServer::nodeKilled(SharedNodePointer killedNode) {436void EntityScriptServer::nodeKilled(SharedNodePointer killedNode) {
350 if (!_shuttingDown && killedNode->getType() == NodeType::EntityServer) {437 switch (killedNode->getType()) {
351 if (_entitiesScriptEngine) {438 case NodeType::EntityServer: {
352 _entitiesScriptEngine->unloadAllEntityScripts();439 if (!_shuttingDown) {
353 _entitiesScriptEngine->stop();440 if (_entitiesScriptEngine) {
441 _entitiesScriptEngine->unloadAllEntityScripts();
442 _entitiesScriptEngine->stop();
443 }
444
445 resetEntitiesScriptEngine();
446
447 _entityViewer.clear();
448 }
449 break;
354 }450 }
355 451 case NodeType::Agent: {
356 resetEntitiesScriptEngine();452 _logListeners.erase(killedNode->getUUID());
357 453 break;
358 _entityViewer.clear();454 }
455 default:
456 // Do nothing
457 break;
359 }458 }
360}459}
361 460