mirror of https://github.com/xemu-project/xemu.git
slirp: use exit notifier for slirp_smb_cleanup
We would like to move back net_cleanup() at the end of main function,
like it used to be until f30dbae63a
, but minimum
cleanup is needed regardless at exit() time for slirp's SMB
functionality. Use an exit notifier to call slirp_smb_cleanup.
If net_cleanup() is called first, then remove the exit notifier as it
will become a dangling pointer otherwise.
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
9e32ff3299
commit
f6c2e66ae8
11
net/slirp.c
11
net/slirp.c
|
@ -38,6 +38,7 @@
|
|||
#include "slirp/libslirp.h"
|
||||
#include "slirp/ip6.h"
|
||||
#include "sysemu/char.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "qemu/cutils.h"
|
||||
|
||||
static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
|
||||
|
@ -76,6 +77,7 @@ typedef struct SlirpState {
|
|||
NetClientState nc;
|
||||
QTAILQ_ENTRY(SlirpState) entry;
|
||||
Slirp *slirp;
|
||||
Notifier exit_notifier;
|
||||
#ifndef _WIN32
|
||||
char smb_dir[128];
|
||||
#endif
|
||||
|
@ -118,11 +120,18 @@ static ssize_t net_slirp_receive(NetClientState *nc, const uint8_t *buf, size_t
|
|||
return size;
|
||||
}
|
||||
|
||||
static void slirp_smb_exit(Notifier *n, void *data)
|
||||
{
|
||||
SlirpState *s = container_of(n, SlirpState, exit_notifier);
|
||||
slirp_smb_cleanup(s);
|
||||
}
|
||||
|
||||
static void net_slirp_cleanup(NetClientState *nc)
|
||||
{
|
||||
SlirpState *s = DO_UPCAST(SlirpState, nc, nc);
|
||||
|
||||
slirp_cleanup(s->slirp);
|
||||
qemu_remove_exit_notifier(&s->exit_notifier);
|
||||
slirp_smb_cleanup(s);
|
||||
QTAILQ_REMOVE(&slirp_stacks, s, entry);
|
||||
}
|
||||
|
@ -349,6 +358,8 @@ static int net_slirp_init(NetClientState *peer, const char *model,
|
|||
}
|
||||
#endif
|
||||
|
||||
s->exit_notifier.notify = slirp_smb_exit;
|
||||
qemu_add_exit_notifier(&s->exit_notifier);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
|
|
Loading…
Reference in New Issue