Notify the user when an fb is released
parent
031555c85d
commit
d63feadeab
|
@ -79,6 +79,7 @@ struct nvnc_client {
|
|||
struct pixman_region16 damage;
|
||||
int n_pending_requests;
|
||||
bool is_updating;
|
||||
struct nvnc_fb* current_fb;
|
||||
nvnc_client_fn cleanup_fn;
|
||||
z_stream z_stream;
|
||||
struct tight_encoder tight_encoder;
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "display.h"
|
||||
#include "neatvnc.h"
|
||||
#include "common.h"
|
||||
#include "fb.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -66,11 +67,14 @@ struct nvnc* nvnc_display_get_server(const struct nvnc_display* self)
|
|||
EXPORT
|
||||
void nvnc_display_set_buffer(struct nvnc_display* self, struct nvnc_fb* fb)
|
||||
{
|
||||
if (self->buffer)
|
||||
if (self->buffer) {
|
||||
nvnc_fb_release(self->buffer);
|
||||
nvnc_fb_unref(self->buffer);
|
||||
}
|
||||
|
||||
self->buffer = fb;
|
||||
nvnc_fb_ref(fb);
|
||||
nvnc_fb_hold(fb);
|
||||
}
|
||||
|
||||
EXPORT
|
||||
|
|
23
src/server.c
23
src/server.c
|
@ -103,6 +103,11 @@ static void client_close(struct nvnc_client* client)
|
|||
if (fn)
|
||||
fn(client);
|
||||
|
||||
if (client->current_fb) {
|
||||
nvnc_fb_release(client->current_fb);
|
||||
nvnc_fb_unref(client->current_fb);
|
||||
}
|
||||
|
||||
LIST_REMOVE(client, link);
|
||||
stream_destroy(client->net_stream);
|
||||
tight_encoder_destroy(&client->tight_encoder);
|
||||
|
@ -553,6 +558,9 @@ static void process_fb_update_requests(struct nvnc_client* client)
|
|||
pixman_region_init(&client->damage);
|
||||
|
||||
client->is_updating = true;
|
||||
client->current_fb = fb;
|
||||
nvnc_fb_hold(fb);
|
||||
nvnc_fb_ref(fb);
|
||||
|
||||
int rc;
|
||||
enum rfb_encodings encoding = choose_frame_encoding(client);
|
||||
|
@ -584,8 +592,13 @@ static void process_fb_update_requests(struct nvnc_client* client)
|
|||
break;
|
||||
}
|
||||
|
||||
if (rc < 0)
|
||||
if (rc < 0) {
|
||||
client->is_updating = false;
|
||||
assert(client->current_fb);
|
||||
nvnc_fb_release(client->current_fb);
|
||||
nvnc_fb_unref(client->current_fb);
|
||||
client->current_fb = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static int on_client_fb_update_request(struct nvnc_client* client)
|
||||
|
@ -1234,6 +1247,10 @@ static void on_write_frame_done(void* userdata, enum stream_req_status status)
|
|||
{
|
||||
struct nvnc_client* client = userdata;
|
||||
client->is_updating = false;
|
||||
assert(client->current_fb);
|
||||
nvnc_fb_release(client->current_fb);
|
||||
nvnc_fb_unref(client->current_fb);
|
||||
client->current_fb = NULL;
|
||||
client_unref(client);
|
||||
}
|
||||
|
||||
|
@ -1316,6 +1333,10 @@ static void finish_fb_update(struct nvnc_client* client, struct vec* frame)
|
|||
DTRACE_PROBE1(neatvnc, send_fb_done, client);
|
||||
} else {
|
||||
client->is_updating = false;
|
||||
assert(client->current_fb);
|
||||
nvnc_fb_release(client->current_fb);
|
||||
nvnc_fb_unref(client->current_fb);
|
||||
client->current_fb = NULL;
|
||||
vec_destroy(frame);
|
||||
client_unref(client);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue