[Spice-devel] [PATCH 13/17] Add RedsState reference to RedsStream
Frediano Ziglio
fziglio at redhat.com
Thu Feb 11 19:24:12 UTC 2016
From: Jonathon Jongsma <jjongsma at redhat.com>
Allows us to remove use of global 'reds' variable from reds-stream.c.
Requires changing the RedsStream constructor to accept a RedsState arg.
---
server/reds-stream.c | 22 +++++++++++++---------
server/reds-stream.h | 3 ++-
server/reds.c | 2 +-
server/tests/stream-test.c | 8 +++++---
4 files changed, 21 insertions(+), 14 deletions(-)
diff --git a/server/reds-stream.c b/server/reds-stream.c
index 2eb8f89..ec720e0 100644
--- a/server/reds-stream.c
+++ b/server/reds-stream.c
@@ -21,9 +21,9 @@
#include "main-dispatcher.h"
#include "red-common.h"
+#include "common/log.h"
#include "reds-stream.h"
#include "reds.h"
-#include "common/log.h"
#include <errno.h>
#include <netdb.h>
@@ -95,6 +95,7 @@ struct RedsStreamPrivate {
ssize_t (*write)(RedsStream *s, const void *buf, size_t nbyte);
ssize_t (*writev)(RedsStream *s, const struct iovec *iov, int iovcnt);
+ RedsState *reds;
};
static ssize_t stream_write_cb(RedsStream *s, const void *buf, size_t size)
@@ -167,7 +168,7 @@ static ssize_t stream_ssl_read_cb(RedsStream *s, void *buf, size_t size)
void reds_stream_remove_watch(RedsStream* s)
{
if (s->watch) {
- reds_get_core_interface(reds)->watch_remove(s->watch);
+ reds_get_core_interface(s->priv->reds)->watch_remove(s->watch);
s->watch = NULL;
}
}
@@ -378,13 +379,14 @@ void reds_stream_set_channel(RedsStream *stream, int connection_id,
stream->priv->info->id = channel_id;
}
-RedsStream *reds_stream_new(int socket)
+RedsStream *reds_stream_new(RedsState *reds, int socket)
{
RedsStream *stream;
stream = spice_malloc0(sizeof(RedsStream) + sizeof(RedsStreamPrivate));
stream->priv = (RedsStreamPrivate *)(stream+1);
stream->priv->info = spice_new0(SpiceChannelEventInfo, 1);
+ stream->priv->reds = reds;
reds_stream_set_socket(stream, socket);
stream->priv->read = stream_read_cb;
@@ -485,21 +487,23 @@ static void async_read_handler(G_GNUC_UNUSED int fd,
void *data)
{
AsyncRead *async = (AsyncRead *)data;
+ RedsStream *stream = async->stream;
+ RedsState *reds = stream->priv->reds;
for (;;) {
int n = async->end - async->now;
spice_assert(n > 0);
- n = reds_stream_read(async->stream, async->now, n);
+ n = reds_stream_read(stream, async->now, n);
if (n <= 0) {
if (n < 0) {
switch (errno) {
case EAGAIN:
- if (!async->stream->watch) {
- async->stream->watch = reds_get_core_interface(reds)->watch_add(reds_get_core_interface(reds),
- async->stream->socket,
- SPICE_WATCH_EVENT_READ,
- async_read_handler, async);
+ if (!stream->watch) {
+ stream->watch = reds_get_core_interface(reds)->watch_add(reds_get_core_interface(reds),
+ stream->socket,
+ SPICE_WATCH_EVENT_READ,
+ async_read_handler, async);
}
return;
case EINTR:
diff --git a/server/reds-stream.h b/server/reds-stream.h
index 72e5dd1..1123048 100644
--- a/server/reds-stream.h
+++ b/server/reds-stream.h
@@ -28,6 +28,7 @@
typedef void (*AsyncReadDone)(void *opaque);
typedef void (*AsyncReadError)(void *opaque, int err);
+typedef struct RedsState RedsState;
typedef struct RedsStream RedsStream;
typedef struct RedsStreamPrivate RedsStreamPrivate;
@@ -67,7 +68,7 @@ void reds_stream_push_channel_event(RedsStream *s, int event);
void reds_stream_remove_watch(RedsStream* s);
void reds_stream_set_channel(RedsStream *stream, int connection_id,
int channel_type, int channel_id);
-RedsStream *reds_stream_new(int socket);
+RedsStream *reds_stream_new(RedsState *reds, int socket);
bool reds_stream_is_ssl(RedsStream *stream);
RedsStreamSslStatus reds_stream_ssl_accept(RedsStream *stream);
int reds_stream_enable_ssl(RedsStream *stream, SSL_CTX *ctx);
diff --git a/server/reds.c b/server/reds.c
index 4611c97..8bb0ce4 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -2324,7 +2324,7 @@ static RedLinkInfo *reds_init_client_connection(RedsState *reds, int socket)
link = spice_new0(RedLinkInfo, 1);
link->reds = reds;
- link->stream = reds_stream_new(socket);
+ link->stream = reds_stream_new(reds, socket);
/* gather info + send event */
diff --git a/server/tests/stream-test.c b/server/tests/stream-test.c
index f83f0e1..3aa059c 100644
--- a/server/tests/stream-test.c
+++ b/server/tests/stream-test.c
@@ -7,10 +7,12 @@
#include "reds-stream.h"
#include "basic_event_loop.h"
+static SpiceServer *server = NULL;
+
static int server_init(void)
{
SpiceCoreInterface *core = basic_event_loop_init();
- SpiceServer *server = spice_server_new();
+ server = spice_server_new();
return spice_server_init(server, core);
}
@@ -89,9 +91,9 @@ int main(int argc, char *argv[])
return -1;
}
- st[0] = reds_stream_new(sv[0]);
+ st[0] = reds_stream_new(server, sv[0]);
spice_assert(reds_stream_is_plain_unix(st[0]));
- st[1] = reds_stream_new(sv[1]);
+ st[1] = reds_stream_new(server, sv[1]);
spice_assert(reds_stream_is_plain_unix(st[1]));
/* send stdin, for the fun of it */
--
2.5.0
More information about the Spice-devel
mailing list