diff options
| author | Konstantin Kostiuk <kkostiuk@redhat.com> | 2025-03-24 15:17:28 +0200 |
|---|---|---|
| committer | Konstantin Kostiuk <kkostiuk@redhat.com> | 2025-06-12 17:02:05 +0300 |
| commit | 6f0273d6ae21bb2e4222789af0e6d480aa9430b1 (patch) | |
| tree | 7271557bf54922dac55dc86dfc0e22138c1a2f6c /qga/main.c | |
| parent | d9ce74873a6a5a7c504379857461e4ae64fcf0cd (diff) | |
| download | focaccia-qemu-6f0273d6ae21bb2e4222789af0e6d480aa9430b1.tar.gz focaccia-qemu-6f0273d6ae21bb2e4222789af0e6d480aa9430b1.zip | |
qga-win: implement a 'guest-get-load' command
Windows has no native equivalent API, but it would be possible to simulate it as illustrated here (BSD-3-Clause): https://github.com/giampaolo/psutil/pull/1485 Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Tested-by: Dehan Meng <demeng@redhat.com> Reviewed-by: Yan Vugenfirer <yvugenfi@redhat.com> Signed-off-by: Konstantin Kostiuk <kkostiuk@redhat.com>
Diffstat (limited to 'qga/main.c')
| -rw-r--r-- | qga/main.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/qga/main.c b/qga/main.c index 72c39b042f..6c02f3ec38 100644 --- a/qga/main.c +++ b/qga/main.c @@ -33,6 +33,7 @@ #include "qemu-version.h" #ifdef _WIN32 #include <dbt.h> +#include <pdh.h> #include "qga/service-win32.h" #include "qga/vss-win32.h" #endif @@ -105,6 +106,9 @@ struct GAState { GAService service; HANDLE wakeup_event; HANDLE event_log; + HANDLE load_avg_wait_handle; + HANDLE load_avg_event; + HQUERY load_avg_pdh_query; #endif bool delimit_response; bool frozen; @@ -582,6 +586,25 @@ const char *ga_fsfreeze_hook(GAState *s) } #endif +#ifdef _WIN32 +void ga_set_load_avg_wait_handle(GAState *s, HANDLE wait_handle) +{ + s->load_avg_wait_handle = wait_handle; +} +void ga_set_load_avg_event(GAState *s, HANDLE event) +{ + s->load_avg_event = event; +} +void ga_set_load_avg_pdh_query(GAState *s, HQUERY query) +{ + s->load_avg_pdh_query = query; +} +HQUERY ga_get_load_avg_pdh_query(GAState *s) +{ + return s->load_avg_pdh_query; +} +#endif + static void become_daemon(const char *pidfile) { #ifndef _WIN32 @@ -1402,6 +1425,10 @@ static GAState *initialize_agent(GAConfig *config, int socket_activation) g_debug("Guest agent version %s started", QEMU_FULL_VERSION); #ifdef _WIN32 + s->load_avg_wait_handle = INVALID_HANDLE_VALUE; + s->load_avg_event = INVALID_HANDLE_VALUE; + s->load_avg_pdh_query = NULL; + s->event_log = RegisterEventSource(NULL, "qemu-ga"); if (!s->event_log) { g_autofree gchar *errmsg = g_win32_error_message(GetLastError()); @@ -1506,6 +1533,18 @@ static void cleanup_agent(GAState *s) #ifdef _WIN32 CloseHandle(s->wakeup_event); CloseHandle(s->event_log); + + if (s->load_avg_wait_handle != INVALID_HANDLE_VALUE) { + UnregisterWait(s->load_avg_wait_handle); + } + + if (s->load_avg_event != INVALID_HANDLE_VALUE) { + CloseHandle(s->load_avg_event); + } + + if (s->load_avg_pdh_query) { + PdhCloseQuery(s->load_avg_pdh_query); + } #endif if (s->command_state) { ga_command_state_cleanup_all(s->command_state); |