core: only warn about leaked proxies

Only give a warning about the leaked proxies and set the core
pointer to NULL. Make sure the proxy handles the NULL pointer in
destroy.
This commit is contained in:
Wim Taymans 2020-06-04 12:33:16 +02:00
parent f1e7e86bee
commit 0ee7d8119c
2 changed files with 8 additions and 7 deletions

View file

@ -188,8 +188,8 @@ static int destroy_proxy(void *object, void *data)
return 0; return 0;
if (object != core) { if (object != core) {
pw_log_warn(NAME" %p: destroy leaked proxy %d", core, p->id); pw_log_warn(NAME" %p: leaked proxy %d", core, p->id);
pw_proxy_destroy(p); p->core = NULL;
} }
return 0; return 0;
} }

View file

@ -213,7 +213,8 @@ void pw_proxy_add_object_listener(struct pw_proxy *proxy,
static inline void remove_from_map(struct pw_proxy *proxy) static inline void remove_from_map(struct pw_proxy *proxy)
{ {
if (proxy->in_map) { if (proxy->in_map) {
pw_map_remove(&proxy->core->objects, proxy->id); if (proxy->core)
pw_map_remove(&proxy->core->objects, proxy->id);
proxy->in_map = false; proxy->in_map = false;
} }
} }
@ -238,7 +239,7 @@ void pw_proxy_destroy(struct pw_proxy *proxy)
if (!proxy->removed) { if (!proxy->removed) {
/* if the server did not remove this proxy, schedule a /* if the server did not remove this proxy, schedule a
* destroy if we can */ * destroy if we can */
if (!proxy->core->removed) { if (proxy->core && !proxy->core->removed) {
pw_core_destroy(proxy->core, proxy); pw_core_destroy(proxy->core, proxy);
proxy->refcount++; proxy->refcount++;
} else { } else {
@ -302,7 +303,7 @@ int pw_proxy_sync(struct pw_proxy *proxy, int seq)
int res = -EIO; int res = -EIO;
struct pw_core *core = proxy->core; struct pw_core *core = proxy->core;
if (!core->removed) { if (core && !core->removed) {
res = pw_core_sync(core, proxy->id, seq); res = pw_core_sync(core, proxy->id, seq);
pw_log_debug(NAME" %p: %u seq:%d sync %u", proxy, proxy->id, seq, res); pw_log_debug(NAME" %p: %u seq:%d sync %u", proxy, proxy->id, seq, res);
} }
@ -317,7 +318,7 @@ int pw_proxy_errorf(struct pw_proxy *proxy, int res, const char *error, ...)
struct pw_core *core = proxy->core; struct pw_core *core = proxy->core;
va_start(ap, error); va_start(ap, error);
if (!core->removed) if (core && !core->removed)
r = pw_core_errorv(core, proxy->id, r = pw_core_errorv(core, proxy->id,
core->recv_seq, res, error, ap); core->recv_seq, res, error, ap);
va_end(ap); va_end(ap);
@ -330,7 +331,7 @@ int pw_proxy_error(struct pw_proxy *proxy, int res, const char *error)
int r = -EIO; int r = -EIO;
struct pw_core *core = proxy->core; struct pw_core *core = proxy->core;
if (!core->removed) if (core && !core->removed)
r = pw_core_error(core, proxy->id, r = pw_core_error(core, proxy->id,
core->recv_seq, res, error); core->recv_seq, res, error);
return r; return r;