Skip to content

Commit

Permalink
dm: vm_event: implement the default event handler
Browse files Browse the repository at this point in the history
The default event handler generates the vm_event message in json format,
then emit it through command monitor.

The event data json txt is currently leaved as blank. When a specific
event type is implemented, its event data generate handler can be added
correspondingly.

Tracked-On: #8547
Signed-off-by: Wu Zhou <wu.zhou@intel.com>
Reviewed-by: Jian Jun Chen <jian.jun.chen@intel.com>
  • Loading branch information
izhouwu authored and acrnsi-robot committed Feb 1, 2024
1 parent c77fb77 commit 36706dd
Showing 1 changed file with 39 additions and 1 deletion.
40 changes: 39 additions & 1 deletion devicemodel/core/vm_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
#include "hsm_ioctl_defs.h"
#include "sbuf.h"
#include "log.h"
#include <cjson/cJSON.h>
#include "monitor.h"

#define VM_EVENT_ELE_SIZE (sizeof(struct vm_event))

Expand All @@ -29,6 +31,7 @@
#define MAX_EPOLL_EVENTS MAX_VM_EVENT_TUNNELS

typedef void (*vm_event_handler)(struct vmctx *ctx, struct vm_event *event);
typedef void (*vm_event_generate_jdata)(cJSON *event_obj, struct vm_event *event);

static int epoll_fd;
static bool started = false;
Expand All @@ -54,17 +57,21 @@ struct vm_event_tunnel {

struct vm_event_proc {
vm_event_handler ve_handler;
vm_event_generate_jdata gen_jdata_handler;
};

static struct vm_event_proc ve_proc[VM_EVENT_COUNT] = {
[VM_EVENT_RTC_CHG] = {
.ve_handler = general_event_handler,
.gen_jdata_handler = NULL,
},
[VM_EVENT_POWEROFF] = {
.ve_handler = general_event_handler,
.gen_jdata_handler = NULL,
},
[VM_EVENT_TRIPLE_FAULT] = {
.ve_handler = general_event_handler,
.gen_jdata_handler = NULL,
},
};

Expand All @@ -77,9 +84,40 @@ static inline struct vm_event_proc *get_vm_event_proc(struct vm_event *event)
return proc;
}

static char *generate_vm_event_message(struct vm_event *event)
{
char *event_msg = NULL;
cJSON *val;
cJSON *event_obj = cJSON_CreateObject();
struct vm_event_proc *proc;

if (event_obj == NULL)
return NULL;
val = cJSON_CreateNumber(event->type);
if (val == NULL)
return NULL;
cJSON_AddItemToObject(event_obj, "vm_event", val);

proc = get_vm_event_proc(event);
if (proc && proc->gen_jdata_handler) {
(proc->gen_jdata_handler)(event_obj, event);
}

event_msg = cJSON_Print(event_obj);
if (event_msg == NULL)
fprintf(stderr, "Failed to generate vm_event message.\n");

cJSON_Delete(event_obj);
return event_msg;
}

static void general_event_handler(struct vmctx *ctx, struct vm_event *event)
{
return;
char *msg = generate_vm_event_message(event);
if (msg != NULL) {
vm_monitor_send_vm_event(msg);
free(msg);
}
}

static void *vm_event_thread(void *param)
Expand Down

0 comments on commit 36706dd

Please sign in to comment.