Showing the changes to assignment-client/src/scripts/EntityScriptServer.cpp (1 of 7 files). Show all
Unified · Split
| @@ -27,9 +27,30 @@ · 26 unmodified lines | ||
| 27 | 27 | #include "ClientServerUtils.h" |
| 28 | 28 | #include "../entities/AssignmentParentFinder.h" |
| 29 | 29 | |
| 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 | + | |
| 30 | 49 | int EntityScriptServer::_entitiesScriptEngineCount = 0; |
| 31 | 50 | |
| 32 | 51 | EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssignment(message) { |
| 52 | + qInstallMessageHandler(messageHandler); | |
| 53 | + | |
| 33 | 54 | DependencyManager::get<EntityScriptingInterface>()->setPacketSender(&_entityEditSender); |
| 34 | 55 | |
| 35 | 56 | ResourceManager::init(); |
| @@ -57,6 +78,18 @@ EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssig · 21 unmodified lines | ||
| 57 | 78 | |
| 58 | 79 | packetReceiver.registerListener(PacketType::ReloadEntityServerScript, this, "handleReloadEntityServerScriptPacket"); |
| 59 | 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 | + | |
| 91 | +EntityScriptServer::~EntityScriptServer() { | |
| 92 | + qInstallMessageHandler(LogHandler::verboseMessageHandler); | |
| 60 | 93 | } |
| 61 | 94 | |
| 62 | 95 | static const QString ENTITY_SCRIPT_SERVER_LOGGING_NAME = "entity-script-server"; |
| @@ -146,6 +179,60 @@ void EntityScriptServer::updateEntityPPS() { · 83 unmodified lines | ||
| 146 | 179 | qDebug() << QString("Updating entity PPS to: %1 @ %2 PPS per script = %3 PPS").arg(numRunningScripts).arg(_entityPPSPerScript).arg(pps); |
| 147 | 180 | } |
| 148 | 181 | |
| 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 | + | |
| 149 | 236 | void EntityScriptServer::run() { |
| 150 | 237 | // make sure we request our script once the agent connects to the domain |
| 151 | 238 | auto nodeList = DependencyManager::get<NodeList>(); |
| @@ -347,15 +434,27 @@ void EntityScriptServer::checkAndCallPreload(const EntityItemID& entityID, const · 195 unmodified lines | ||
| 347 | 434 | } |
| 348 | 435 | |
| 349 | 436 | 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; | |
| 354 | 450 | } |
| 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; | |
| 359 | 458 | } |
| 360 | 459 | } |
| 361 | 460 | |