server: Defer client_unref in close_after_write

This ensures that the stream object stays alive while its write
queue is being processed.
pull/93/head
Andri Yngvason 2023-07-04 23:40:29 +00:00
parent 61fad8c96b
commit 8872dece0c
1 changed files with 20 additions and 1 deletions

View File

@ -146,12 +146,31 @@ static inline void client_ref(struct nvnc_client* client)
++client->ref; ++client->ref;
} }
static void deferred_client_close(void *obj)
{
client_unref(obj);
}
static void stop_self(void* obj)
{
aml_stop(aml_get_default(), obj);
}
static void close_after_write(void* userdata, enum stream_req_status status) static void close_after_write(void* userdata, enum stream_req_status status)
{ {
struct nvnc_client* client = userdata; struct nvnc_client* client = userdata;
nvnc_log(NVNC_LOG_DEBUG, "close_after_write(%p): ref %d", client, nvnc_log(NVNC_LOG_DEBUG, "close_after_write(%p): ref %d", client,
client->ref); client->ref);
nvnc_client_close(client); stream_close(client->net_stream);
/* This is a rather hacky way of making sure that the client object
* stays alive while the stream is processing its queue.
* TODO: Figure out some better resource management for clients
*/
struct aml_idle* idle = aml_idle_new(stop_self, client,
deferred_client_close);
aml_start(aml_get_default(), idle);
aml_unref(idle);
} }
static int handle_unsupported_version(struct nvnc_client* client) static int handle_unsupported_version(struct nvnc_client* client)