summaryrefslogtreecommitdiffstats
path: root/src/server/net.c
diff options
context:
space:
mode:
authorsr2012-09-04 19:22:57 +0200
committersr2012-09-04 19:22:57 +0200
commitbc4e381484024237df0b04bb667f742fe4846b35 (patch)
treea28ee79b9999eb9c1436f0f7f6e7042537b413d2 /src/server/net.c
parent[SERVER] Check which dnbd3 devices are idle and ready to use for proxy mode (diff)
downloaddnbd3-bc4e381484024237df0b04bb667f742fe4846b35.tar.gz
dnbd3-bc4e381484024237df0b04bb667f742fe4846b35.tar.xz
dnbd3-bc4e381484024237df0b04bb667f742fe4846b35.zip
[SERVER] More work towards automatic server discovery and querying
Diffstat (limited to 'src/server/net.c')
-rw-r--r--src/server/net.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/server/net.c b/src/server/net.c
index 963d3ea..b351ed3 100644
--- a/src/server/net.c
+++ b/src/server/net.c
@@ -32,6 +32,7 @@
#include <arpa/inet.h>
#include <netinet/tcp.h>
+#include "helper.h"
#include "server.h"
#include "saveload.h"
#include "memlog.h"
@@ -223,6 +224,7 @@ void *dnbd3_handle_query(void *dnbd3_client)
}
}
+ // client handling mainloop
if (image) while (recv_request_header(client->sock, &request))
{
switch (request.cmd)
@@ -393,6 +395,21 @@ void *dnbd3_handle_query(void *dnbd3_client)
}
+ // Check for messages that have been queued from another thread
+ while (client->sendqueue != NULL)
+ {
+ dnbd3_binstring_t *message = NULL;
+ pthread_spin_lock(&_spinlock);
+ if (client->sendqueue != NULL)
+ {
+ message = client->sendqueue->data;
+ client->sendqueue = g_slist_remove(client->sendqueue, message);
+ }
+ pthread_spin_unlock(&_spinlock);
+ send_data(client->sock, message->data, message->len);
+ free(message);
+ }
+
}
pthread_spin_lock(&_spinlock);
_dnbd3_clients = g_slist_remove(_dnbd3_clients, client);
@@ -401,7 +418,7 @@ void *dnbd3_handle_query(void *dnbd3_client)
close(client->sock);
if (image_file != -1) close(image_file);
if (image_cache != -1) close(image_cache);
- g_free(client);
+ dnbd3_free_client(client);
pthread_exit((void *) 0);
}