| 1104 | } |
| 1105 | |
| 1106 | void ProfilerListener::processCommand(thread_db* tdbb) |
| 1107 | { |
| 1108 | const auto header = ipc->sharedMemory->getHeader(); |
| 1109 | const auto profilerManager = attachment->getProfilerManager(tdbb); |
| 1110 | |
| 1111 | if (header->userName[0] && attachment->getUserName() != header->userName) |
| 1112 | status_exception::raise(Arg::Gds(isc_miss_prvlg) << "PROFILE_ANY_ATTACHMENT"); |
| 1113 | |
| 1114 | using Tag = ProfilerIpc::Tag; |
| 1115 | |
| 1116 | switch (header->tag) |
| 1117 | { |
| 1118 | case Tag::CANCEL_SESSION: |
| 1119 | profilerManager->cancelSession(); |
| 1120 | header->bufferSize = 0; |
| 1121 | break; |
| 1122 | |
| 1123 | case Tag::DISCARD: |
| 1124 | profilerManager->discard(); |
| 1125 | header->bufferSize = 0; |
| 1126 | break; |
| 1127 | |
| 1128 | case Tag::FINISH_SESSION: |
| 1129 | { |
| 1130 | const auto in = reinterpret_cast<const ProfilerPackage::FinishSessionInput::Type*>(header->buffer); |
| 1131 | fb_assert(sizeof(*in) == header->bufferSize); |
| 1132 | profilerManager->finishSession(tdbb, in->flush); |
| 1133 | header->bufferSize = 0; |
| 1134 | break; |
| 1135 | } |
| 1136 | |
| 1137 | case Tag::FLUSH: |
| 1138 | profilerManager->flush(); |
| 1139 | header->bufferSize = 0; |
| 1140 | break; |
| 1141 | |
| 1142 | case Tag::PAUSE_SESSION: |
| 1143 | { |
| 1144 | const auto in = reinterpret_cast<const ProfilerPackage::PauseSessionInput::Type*>(header->buffer); |
| 1145 | fb_assert(sizeof(*in) == header->bufferSize); |
| 1146 | profilerManager->pauseSession(in->flush); |
| 1147 | header->bufferSize = 0; |
| 1148 | break; |
| 1149 | } |
| 1150 | |
| 1151 | case Tag::RESUME_SESSION: |
| 1152 | profilerManager->resumeSession(); |
| 1153 | header->bufferSize = 0; |
| 1154 | break; |
| 1155 | |
| 1156 | case Tag::SET_FLUSH_INTERVAL: |
| 1157 | { |
| 1158 | const auto in = reinterpret_cast<const ProfilerPackage::SetFlushIntervalInput::Type*>(header->buffer); |
| 1159 | fb_assert(sizeof(*in) == header->bufferSize); |
| 1160 | |
| 1161 | profilerManager->setFlushInterval(in->flushInterval); |
| 1162 | header->bufferSize = 0; |
| 1163 | break; |
nothing calls this directly
no test coverage detected