summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/Makefile.am2
-rw-r--r--server/red-channel.c6
-rw-r--r--server/red-channel.h13
-rw-r--r--server/red-pipe-item.c53
-rw-r--r--server/red-pipe-item.h46
5 files changed, 102 insertions, 18 deletions
diff --git a/server/Makefile.am b/server/Makefile.am
index a7a8d9f2..a119c86b 100644
--- a/server/Makefile.am
+++ b/server/Makefile.am
@@ -112,6 +112,8 @@ libserver_la_SOURCES = \
display-channel.h \
cursor-channel.c \
cursor-channel.h \
+ red-pipe-item.c \
+ red-pipe-item.h \
reds.c \
reds.h \
reds-private.h \
diff --git a/server/red-channel.c b/server/red-channel.c
index cfddea06..3e036c98 100644
--- a/server/red-channel.c
+++ b/server/red-channel.c
@@ -1658,12 +1658,6 @@ void red_channel_client_set_message_serial(RedChannelClient *rcc, uint64_t seria
rcc->send_data.serial = serial;
}
-void pipe_item_init(PipeItem *item, int type)
-{
- ring_item_init(&item->link);
- item->type = type;
-}
-
static inline gboolean client_pipe_add(RedChannelClient *rcc, PipeItem *item, RingItem *pos)
{
spice_assert(rcc && item);
diff --git a/server/red-channel.h b/server/red-channel.h
index 94b09eb2..3c762ff6 100644
--- a/server/red-channel.h
+++ b/server/red-channel.h
@@ -33,6 +33,7 @@
#include "demarshallers.h"
#include "reds-stream.h"
#include "stat.h"
+#include "red-pipe-item.h"
#define MAX_SEND_BUFS 1000
#define CLIENT_ACK_WINDOW 20
@@ -147,16 +148,6 @@ enum {
PIPE_ITEM_TYPE_CHANNEL_BASE=101,
};
-typedef struct PipeItem {
- RingItem link;
- int type;
-} PipeItem;
-
-static inline int pipe_item_is_linked(PipeItem *item)
-{
- return ring_item_is_linked(&item->link);
-}
-
typedef uint8_t *(*channel_alloc_msg_recv_buf_proc)(RedChannelClient *channel,
uint16_t type, uint32_t size);
typedef int (*channel_handle_parsed_proc)(RedChannelClient *rcc, uint32_t size, uint16_t type,
@@ -473,8 +464,6 @@ int red_channel_client_get_roundtrip_ms(RedChannelClient *rcc);
*/
void red_channel_client_start_connectivity_monitoring(RedChannelClient *rcc, uint32_t timeout_ms);
-void pipe_item_init(PipeItem *item, int type);
-
// TODO: add back the channel_pipe_add functionality - by adding reference counting
// to the PipeItem.
diff --git a/server/red-pipe-item.c b/server/red-pipe-item.c
new file mode 100644
index 00000000..098f1d46
--- /dev/null
+++ b/server/red-pipe-item.c
@@ -0,0 +1,53 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include "red-channel.h"
+#include "red-pipe-item.h"
+
+PipeItem *pipe_item_ref(gpointer object)
+{
+ PipeItem *item = object;
+
+ g_return_val_if_fail(item->refcount > 0, NULL);
+
+ g_atomic_int_inc(&item->refcount);
+
+ return item;
+}
+
+void pipe_item_unref(gpointer object)
+{
+ PipeItem *item = object;
+
+ g_return_if_fail(item->refcount > 0);
+
+ if (g_atomic_int_dec_and_test(&item->refcount)) {
+ item->free_func(item);
+ }
+}
+
+void pipe_item_init_full(PipeItem *item,
+ gint type,
+ GDestroyNotify free_func)
+{
+ ring_item_init(&item->link);
+ item->type = type;
+ item->refcount = 1;
+ item->free_func = free_func ? free_func : (GDestroyNotify)free;
+}
diff --git a/server/red-pipe-item.h b/server/red-pipe-item.h
new file mode 100644
index 00000000..4333e199
--- /dev/null
+++ b/server/red-pipe-item.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#ifndef _H_RED_PIPE_ITEM
+#define _H_RED_PIPE_ITEM
+
+#include <glib.h>
+
+typedef struct {
+ RingItem link;
+ int type;
+
+ /* private */
+ int refcount;
+
+ GDestroyNotify free_func;
+} PipeItem;
+
+void pipe_item_init_full(PipeItem *item, int type, GDestroyNotify free_func);
+PipeItem *pipe_item_ref(gpointer item);
+void pipe_item_unref(gpointer item);
+
+static inline int pipe_item_is_linked(PipeItem *item)
+{
+ return ring_item_is_linked(&item->link);
+}
+
+static inline void pipe_item_init(PipeItem *item, int type)
+{
+ pipe_item_init_full(item, type, NULL);
+}
+#endif