diff --git a/server/red-parse-qxl.cpp b/server/red-parse-qxl.cpp index 66f6b5d7..419da12b 100644 --- a/server/red-parse-qxl.cpp +++ b/server/red-parse-qxl.cpp @@ -1367,45 +1367,26 @@ static bool red_get_message(QXLInstance *qxl_instance, RedMemSlotInfo *slots, in return true; } -static void red_put_message(RedMessage *red) +RedMessage::~RedMessage() { - if (red->qxl != nullptr) { - red_qxl_release_resource(red->qxl, red->release_info_ext); + if (qxl != nullptr) { + red_qxl_release_resource(qxl, release_info_ext); } } -RedMessage *red_message_new(QXLInstance *qxl, RedMemSlotInfo *slots, - int group_id, QXLPHYSICAL addr) +red::shared_ptr +red_message_new(QXLInstance *qxl, RedMemSlotInfo *slots, + int group_id, QXLPHYSICAL addr) { - RedMessage *red; + auto red = red::make_shared(); - red = g_new0(RedMessage, 1); - - red->refs = 1; - - if (!red_get_message(qxl, slots, group_id, red, addr)) { - red_message_unref(red); - return nullptr; + if (!red_get_message(qxl, slots, group_id, red.get(), addr)) { + red.reset(); } return red; } -RedMessage *red_message_ref(RedMessage *red) -{ - red->refs++; - return red; -} - -void red_message_unref(RedMessage *red) -{ - if (--red->refs) { - return; - } - red_put_message(red); - g_free(red); -} - static unsigned int surface_format_to_bpp(uint32_t format) { switch (format) { diff --git a/server/red-parse-qxl.h b/server/red-parse-qxl.h index 1eb0d928..0226659a 100644 --- a/server/red-parse-qxl.h +++ b/server/red-parse-qxl.h @@ -71,13 +71,13 @@ typedef struct RedUpdateCmd { uint32_t surface_id; } RedUpdateCmd; -typedef struct RedMessage { +struct RedMessage final: public red::simple_ptr_counted { + ~RedMessage(); QXLInstance *qxl; QXLReleaseInfoExt release_info_ext; - int refs; int len; uint8_t *data; -} RedMessage; +}; typedef struct RedSurfaceCreate { uint32_t format; @@ -131,10 +131,9 @@ RedUpdateCmd *red_update_cmd_new(QXLInstance *qxl, RedMemSlotInfo *slots, RedUpdateCmd *red_update_cmd_ref(RedUpdateCmd *red); void red_update_cmd_unref(RedUpdateCmd *red); -RedMessage *red_message_new(QXLInstance *qxl, RedMemSlotInfo *slots, - int group_id, QXLPHYSICAL addr); -RedMessage *red_message_ref(RedMessage *red); -void red_message_unref(RedMessage *red); +red::shared_ptr +red_message_new(QXLInstance *qxl, RedMemSlotInfo *slots, + int group_id, QXLPHYSICAL addr); bool red_validate_surface(uint32_t width, uint32_t height, int32_t stride, uint32_t format); diff --git a/server/red-worker.cpp b/server/red-worker.cpp index 62028a53..6e2eeb6d 100644 --- a/server/red-worker.cpp +++ b/server/red-worker.cpp @@ -221,17 +221,14 @@ static int red_process_display(RedWorker *worker, int *ring_is_empty) break; } case QXL_CMD_MESSAGE: { - RedMessage *message; - - message = red_message_new(worker->qxl, &worker->mem_slots, - ext_cmd.group_id, ext_cmd.cmd.data); - if (message == nullptr) { + auto message = red_message_new(worker->qxl, &worker->mem_slots, + ext_cmd.group_id, ext_cmd.cmd.data); + if (!message) { break; } #ifdef DEBUG spice_warning("MESSAGE: %.*s", message->len, message->data); #endif - red_message_unref(message); break; } case QXL_CMD_SURFACE: