void PerformanceMonitor::OnTimer(UINT_PTR /*timer_id*/) { std::vector<double> cpu; if (cpu_counter_->Next(&cpu) && !cpu.empty()) { auto max = std::max_element(cpu.begin(), cpu.end()); if (*max > cpu_usage_threshold_) cpu_time_ = 0; else ++cpu_time_; } std::vector<double> disk; if (disk_counter_->Next(&disk) && !disk.empty()) { auto max = std::max_element(disk.begin(), disk.end()); if (*max > disk_usage_threshold_) disk_time_ = 0; else ++disk_time_; } std::vector<double> traffic; if (traffic_counter_->Next(&traffic) && !traffic.empty()) { auto total = std::accumulate(traffic.begin(), traffic.end(), 0.0); if (total > traffic_threshold_) traffic_time_ = 0; else ++traffic_time_; } if (!enabled_) return; auto would_block = monitor_cpu_ && cpu_time_ < cpu_time_threshold_ || monitor_disk_ && disk_time_ < disk_time_threshold_ || monitor_traffic_ && traffic_time_ < traffic_time_threshold_; if (block_ && !would_block) { UnblockShutdown(); if (sleep_) { sleep_ = false; SetSuspendState(FALSE, FALSE, FALSE); } } else if (!block_ && would_block) { BlockShutdown(); } }
void ProcessLocalData(LOCALPKT *local) { BOOL ok; static char *fid = "ProcessLocalData"; local->raw.hdr.status = ISI_RAW_STATUS_OK; MUTEX_LOCK(&local->mutex); /* If appropriate, add sequence number and time stamps to the packet headers */ switch (local->raw.hdr.desc.type) { case ISI_TYPE_IDA9: CompleteIda9Header(&local->raw, local->dl, local->rt593); break; case ISI_TYPE_IDA5: case ISI_TYPE_IDA6: CompleteIda5Header(&local->raw, local->dl); break; case ISI_TYPE_IDA10: CompleteIda10Header(&local->raw, local->dl); break; #ifdef INCLUDE_Q330 case ISI_TYPE_QDPLUS: CompleteQdplusHeader(&local->raw, local->dl); break; #endif /* INCLUDE_Q330 */ } /* Write to the disk loop */ BlockShutdown(fid); ok = isidlWriteToDiskLoop(local->dl, &local->raw, ISI_OPTION_GENERATE_SEQNO); UnblockShutdown(fid); MUTEX_UNLOCK(&local->mutex); if (!ok) { LogMsg(LOG_INFO, "%s: isidlWriteToDiskLoop: %s", fid, strerror(errno)); Exit(MY_MOD_ID + 2); } }