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 | #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 | |||
| 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 | int EntityScriptServer::_entitiesScriptEngineCount = 0; | 49 | int EntityScriptServer::_entitiesScriptEngineCount = 0; |
| 31 | 50 | ||
| 32 | EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssignment(message) { | 51 | EntityScriptServer::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 | |||
| 91 | EntityScriptServer::~EntityScriptServer() { | ||
| 92 | qInstallMessageHandler(LogHandler::verboseMessageHandler); | ||
| 60 | } | 93 | } |
| 61 | 94 | ||
| 62 | static const QString ENTITY_SCRIPT_SERVER_LOGGING_NAME = "entity-script-server"; | 95 | static 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 | ||
| 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 | void EntityScriptServer::run() { | 236 | void EntityScriptServer::run() { |
| 150 | // make sure we request our script once the agent connects to the domain | 237 | // 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 | ||
| 349 | void EntityScriptServer::nodeKilled(SharedNodePointer killedNode) { | 436 | void 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 | ||