To allow allocating an array of NetClientState and free it once, this patch
introduces destructor of NetClientState. Which could do type specific free,
which could be used by multiqueue to free the array once.
Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
typedef ssize_t (NetReceiveIOV)(NetClientState *, const struct iovec *, int);
typedef void (NetCleanup) (NetClientState *);
typedef void (LinkStatusChanged)(NetClientState *);
typedef ssize_t (NetReceiveIOV)(NetClientState *, const struct iovec *, int);
typedef void (NetCleanup) (NetClientState *);
typedef void (LinkStatusChanged)(NetClientState *);
+typedef void (NetClientDestructor)(NetClientState *);
typedef struct NetClientInfo {
NetClientOptionsKind type;
typedef struct NetClientInfo {
NetClientOptionsKind type;
char *name;
char info_str[256];
unsigned receive_disabled : 1;
char *name;
char info_str[256];
unsigned receive_disabled : 1;
+ NetClientDestructor *destructor;
};
typedef struct NICState {
};
typedef struct NICState {
+static void qemu_net_client_destructor(NetClientState *nc)
+{
+ g_free(nc);
+}
+
static void qemu_net_client_setup(NetClientState *nc,
NetClientInfo *info,
NetClientState *peer,
const char *model,
static void qemu_net_client_setup(NetClientState *nc,
NetClientInfo *info,
NetClientState *peer,
const char *model,
+ const char *name,
+ NetClientDestructor *destructor)
{
nc->info = info;
nc->model = g_strdup(model);
{
nc->info = info;
nc->model = g_strdup(model);
QTAILQ_INSERT_TAIL(&net_clients, nc, next);
nc->send_queue = qemu_new_net_queue(nc);
QTAILQ_INSERT_TAIL(&net_clients, nc, next);
nc->send_queue = qemu_new_net_queue(nc);
+ nc->destructor = destructor;
}
NetClientState *qemu_new_net_client(NetClientInfo *info,
}
NetClientState *qemu_new_net_client(NetClientInfo *info,
assert(info->size >= sizeof(NetClientState));
nc = g_malloc0(info->size);
assert(info->size >= sizeof(NetClientState));
nc = g_malloc0(info->size);
- qemu_net_client_setup(nc, info, peer, model, name);
+ qemu_net_client_setup(nc, info, peer, model, name,
+ qemu_net_client_destructor);
}
g_free(nc->name);
g_free(nc->model);
}
g_free(nc->name);
g_free(nc->model);
+ if (nc->destructor) {
+ nc->destructor(nc);
+ }
}
void qemu_del_net_client(NetClientState *nc)
}
void qemu_del_net_client(NetClientState *nc)