]> git.proxmox.com Git - mirror_qemu.git/blame - qga/guest-agent-command-state.c
acpi-test-data: add _DIS methods
[mirror_qemu.git] / qga / guest-agent-command-state.c
CommitLineData
13a286d5
MR
1/*
2 * QEMU Guest Agent command state interfaces
3 *
4 * Copyright IBM Corp. 2011
5 *
6 * Authors:
7 * Michael Roth <mdroth@linux.vnet.ibm.com>
8 *
9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 * See the COPYING file in the top-level directory.
11 */
4459bf38 12#include "qemu/osdep.h"
13a286d5
MR
13#include <glib.h>
14#include "qga/guest-agent-core.h"
15
16struct GACommandState {
17 GSList *groups;
18};
19
20typedef struct GACommandGroup {
21 void (*init)(void);
22 void (*cleanup)(void);
23} GACommandGroup;
24
25/* handle init/cleanup for stateful guest commands */
26
27void ga_command_state_add(GACommandState *cs,
28 void (*init)(void),
29 void (*cleanup)(void))
30{
f3a06403 31 GACommandGroup *cg = g_new0(GACommandGroup, 1);
13a286d5
MR
32 cg->init = init;
33 cg->cleanup = cleanup;
34 cs->groups = g_slist_append(cs->groups, cg);
35}
36
37static void ga_command_group_init(gpointer opaque, gpointer unused)
38{
39 GACommandGroup *cg = opaque;
40
41 g_assert(cg);
42 if (cg->init) {
43 cg->init();
44 }
45}
46
47void ga_command_state_init_all(GACommandState *cs)
48{
49 g_assert(cs);
50 g_slist_foreach(cs->groups, ga_command_group_init, NULL);
51}
52
53static void ga_command_group_cleanup(gpointer opaque, gpointer unused)
54{
55 GACommandGroup *cg = opaque;
56
57 g_assert(cg);
58 if (cg->cleanup) {
59 cg->cleanup();
60 }
61}
62
63void ga_command_state_cleanup_all(GACommandState *cs)
64{
65 g_assert(cs);
66 g_slist_foreach(cs->groups, ga_command_group_cleanup, NULL);
67}
68
69GACommandState *ga_command_state_new(void)
70{
f3a06403 71 GACommandState *cs = g_new0(GACommandState, 1);
13a286d5
MR
72 cs->groups = NULL;
73 return cs;
74}