red-parse-qxl: Use a base reference class for RedMessage

Don't code manually reference counting for this structure

Signed-off-by: Frediano Ziglio <freddy77@gmail.com>
Acked-by: Victor Toso <victortoso@redhat.com>
This commit is contained in:
Frediano Ziglio 2020-05-05 16:59:52 +01:00
parent 6eac8cc08f
commit 45f2d94ac3
3 changed files with 18 additions and 41 deletions

View File

@ -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<const RedMessage>
red_message_new(QXLInstance *qxl, RedMemSlotInfo *slots,
int group_id, QXLPHYSICAL addr)
{
RedMessage *red;
auto red = red::make_shared<RedMessage>();
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) {

View File

@ -71,13 +71,13 @@ typedef struct RedUpdateCmd {
uint32_t surface_id;
} RedUpdateCmd;
typedef struct RedMessage {
struct RedMessage final: public red::simple_ptr_counted<RedMessage> {
~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<const RedMessage>
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);

View File

@ -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: