1
0
mirror of https://github.com/falk-werner/webfuse synced 2025-06-13 12:54:15 +00:00

removes duplicate implementation of slist (message_queue)

This commit is contained in:
Falk Werner 2019-04-16 22:33:33 +02:00
parent 5a2cdd237f
commit 037dfe6b02
8 changed files with 35 additions and 99 deletions

View File

@ -24,7 +24,7 @@ static bool wf_impl_session_send(
if (result) if (result)
{ {
wf_message_queue_push(&session->queue, message); wf_slist_append(&session->messages, &message->item);
lws_callback_on_writable(session->wsi); lws_callback_on_writable(session->wsi);
result = true; result = true;
@ -56,7 +56,7 @@ struct wf_impl_session * wf_impl_session_create(
session->authenticators = authenticators; session->authenticators = authenticators;
session->server = server; session->server = server;
wf_impl_jsonrpc_proxy_init(&session->rpc, timeout_manager, &wf_impl_session_send, session); wf_impl_jsonrpc_proxy_init(&session->rpc, timeout_manager, &wf_impl_session_send, session);
wf_message_queue_init(&session->queue); wf_slist_init(&session->messages);
} }
return session; return session;
@ -82,7 +82,7 @@ void wf_impl_session_dispose(
wf_impl_session_dispose_filesystems(&session->filesystems); wf_impl_session_dispose_filesystems(&session->filesystems);
wf_impl_jsonrpc_proxy_cleanup(&session->rpc); wf_impl_jsonrpc_proxy_cleanup(&session->rpc);
wf_message_queue_cleanup(&session->queue); wf_message_queue_cleanup(&session->messages);
session->is_authenticated = false; session->is_authenticated = false;
session->wsi = NULL; session->wsi = NULL;
session->authenticators = NULL; session->authenticators = NULL;
@ -113,13 +113,14 @@ bool wf_impl_session_add_filesystem(
void wf_impl_session_onwritable( void wf_impl_session_onwritable(
struct wf_impl_session * session) struct wf_impl_session * session)
{ {
if (!wf_message_queue_empty(&session->queue)) if (!wf_slist_empty(&session->messages))
{ {
struct wf_message * message = wf_message_queue_pop(&session->queue); struct wf_slist_item * item = wf_slist_remove_first(&session->messages);
struct wf_message * message = WF_CONTAINER_OF(item, struct wf_message, item);
lws_write(session->wsi, (unsigned char*) message->data, message->length, LWS_WRITE_TEXT); lws_write(session->wsi, (unsigned char*) message->data, message->length, LWS_WRITE_TEXT);
wf_message_dispose(message); wf_message_dispose(message);
if (!wf_message_queue_empty(&session->queue)) if (!wf_slist_empty(&session->messages))
{ {
lws_callback_on_writable(session->wsi); lws_callback_on_writable(session->wsi);
} }

View File

@ -32,7 +32,7 @@ struct wf_impl_session
char * mount_point; char * mount_point;
struct lws * wsi; struct lws * wsi;
bool is_authenticated; bool is_authenticated;
struct wf_message_queue queue; struct wf_slist messages;
struct wf_impl_authenticators * authenticators; struct wf_impl_authenticators * authenticators;
struct wf_impl_jsonrpc_server * server; struct wf_impl_jsonrpc_server * server;
struct wf_impl_jsonrpc_proxy rpc; struct wf_impl_jsonrpc_proxy rpc;

View File

@ -16,7 +16,6 @@ extern struct wf_message * wf_message_create(json_t const * value)
{ {
message->data = &data[sizeof(struct wf_message) + LWS_PRE]; message->data = &data[sizeof(struct wf_message) + LWS_PRE];
message->length = length; message->length = length;
message->next = NULL;
json_dumpb(value, message->data, length, JSON_COMPACT); json_dumpb(value, message->data, length, JSON_COMPACT);
} }

View File

@ -9,10 +9,11 @@ using std::size_t;
#endif #endif
#include <jansson.h> #include <jansson.h>
#include "webfuse/core/slist.h"
struct wf_message struct wf_message
{ {
struct wf_message * next; struct wf_slist_item item;
char * data; char * data;
size_t length; size_t length;
}; };
@ -22,7 +23,8 @@ extern "C"
{ {
#endif #endif
extern struct wf_message * wf_message_create(json_t const * value); extern struct wf_message * wf_message_create(
json_t const * value);
extern void wf_message_dispose( extern void wf_message_dispose(
struct wf_message * message); struct wf_message * message);

View File

@ -1,63 +1,17 @@
#include "webfuse/core/message_queue.h" #include "webfuse/core/message_queue.h"
#include "webfuse/core/message.h" #include "webfuse/core/message.h"
#include "webfuse/core/container_of.h"
void wf_message_queue_init(
struct wf_message_queue * queue)
{
queue->first = NULL;
queue->last = NULL;
}
void wf_message_queue_cleanup( void wf_message_queue_cleanup(
struct wf_message_queue * queue) struct wf_slist * queue)
{ {
struct wf_message * message = queue->first; struct wf_slist_item * item = queue->first;
while (NULL != message) while (NULL != item)
{ {
struct wf_message * next = message->next; struct wf_slist_item * next = item->next;
struct wf_message * message = WF_CONTAINER_OF(item, struct wf_message, item);
wf_message_dispose(message); wf_message_dispose(message);
message = next; item = next;
} }
wf_message_queue_init(queue); wf_slist_init(queue);
}
bool wf_message_queue_empty(
struct wf_message_queue * queue)
{
return (NULL == queue->first);
}
void wf_message_queue_push(
struct wf_message_queue * queue,
struct wf_message * message)
{
message->next = NULL;
if (NULL != queue->last)
{
queue->last->next = message;
queue->last = message;
}
else
{
queue->first = message;
queue->last = message;
}
}
struct wf_message * wf_message_queue_pop(
struct wf_message_queue * queue)
{
struct wf_message * const result = queue->first;
if (NULL != result)
{
queue->first = queue->first->next;
if (NULL == queue->first)
{
queue->last = NULL;
}
}
return result;
} }

View File

@ -1,39 +1,16 @@
#ifndef WF_MESSAGE_QUEUE_H #ifndef WF_MESSAGE_QUEUE_H
#define WF_MESSAGE_QUEUE_H #define WF_MESSAGE_QUEUE_H
#ifndef __cplusplus
#include <stdbool.h>
#endif
struct wf_message_queue;
struct wf_message;
struct wf_message_queue
{
struct wf_message * first;
struct wf_message * last;
};
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
{ {
#endif #endif
extern void wf_message_queue_init( struct wf_slist;
struct wf_message_queue * queue);
extern void wf_message_queue_cleanup( extern void wf_message_queue_cleanup(
struct wf_message_queue * queue); struct wf_slist * queue);
extern bool wf_message_queue_empty(
struct wf_message_queue * queue);
extern void wf_message_queue_push(
struct wf_message_queue * queue,
struct wf_message * message);
extern struct wf_message * wf_message_queue_pop(
struct wf_message_queue * queue);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -10,6 +10,8 @@
#include "webfuse/provider/impl/provider.h" #include "webfuse/provider/impl/provider.h"
#include "webfuse/core/util.h" #include "webfuse/core/util.h"
#include "webfuse/core/message.h" #include "webfuse/core/message.h"
#include "webfuse/core/message_queue.h"
#include "webfuse/core/container_of.h"
static void wfp_impl_client_protocol_respond( static void wfp_impl_client_protocol_respond(
json_t * response, json_t * response,
@ -20,7 +22,7 @@ static void wfp_impl_client_protocol_respond(
struct wf_message * message = wf_message_create(response); struct wf_message * message = wf_message_create(response);
if (NULL != message) if (NULL != message)
{ {
wf_message_queue_push(&protocol->queue, message); wf_slist_append(&protocol->messages, &message->item);
lws_callback_on_writable(protocol->wsi); lws_callback_on_writable(protocol->wsi);
} }
} }
@ -59,7 +61,7 @@ static void wfp_impl_client_protocol_add_filesystem(
struct wf_message * message = wf_message_create(request); struct wf_message * message = wf_message_create(request);
if (NULL != message) if (NULL != message)
{ {
wf_message_queue_push(&protocol->queue, message); wf_slist_append(&protocol->messages, &message->item);
lws_callback_on_writable(protocol->wsi); lws_callback_on_writable(protocol->wsi);
} }
@ -96,13 +98,14 @@ static int wfp_impl_client_protocol_callback(
case LWS_CALLBACK_SERVER_WRITEABLE: case LWS_CALLBACK_SERVER_WRITEABLE:
// fall-through // fall-through
case LWS_CALLBACK_CLIENT_WRITEABLE: case LWS_CALLBACK_CLIENT_WRITEABLE:
if ((wsi == protocol->wsi) && (!wf_message_queue_empty(&protocol->queue))) if ((wsi == protocol->wsi) && (!wf_slist_empty(&protocol->messages)))
{ {
struct wf_message * message = wf_message_queue_pop(&protocol->queue); struct wf_slist_item * item = wf_slist_remove_first(&protocol->messages);
struct wf_message * message = WF_CONTAINER_OF(item, struct wf_message, item);
lws_write(wsi, (unsigned char*) message->data, message->length, LWS_WRITE_TEXT); lws_write(wsi, (unsigned char*) message->data, message->length, LWS_WRITE_TEXT);
wf_message_dispose(message); wf_message_dispose(message);
if (!wf_message_queue_empty(&protocol->queue)) if (!wf_slist_empty(&protocol->messages))
{ {
lws_callback_on_writable(wsi); lws_callback_on_writable(wsi);
@ -123,7 +126,7 @@ void wfp_impl_client_protocol_init(
struct wfp_provider const * provider, struct wfp_provider const * provider,
void * user_data) void * user_data)
{ {
wf_message_queue_init(&protocol->queue); wf_slist_init(&protocol->messages);
protocol->wsi = NULL; protocol->wsi = NULL;
@ -137,7 +140,7 @@ void wfp_impl_client_protocol_init(
void wfp_impl_client_protocol_cleanup( void wfp_impl_client_protocol_cleanup(
struct wfp_client_protocol * protocol) struct wfp_client_protocol * protocol)
{ {
wf_message_queue_cleanup(&protocol->queue); wf_message_queue_cleanup(&protocol->messages);
} }
struct wfp_client_protocol * wfp_impl_client_protocol_create( struct wfp_client_protocol * wfp_impl_client_protocol_create(

View File

@ -4,7 +4,7 @@
#include "webfuse/provider/impl/provider.h" #include "webfuse/provider/impl/provider.h"
#include "webfuse/provider/impl/request.h" #include "webfuse/provider/impl/request.h"
#include "webfuse/core/message_queue.h" #include "webfuse/core/slist.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
@ -20,7 +20,7 @@ struct wfp_client_protocol
struct wfp_provider provider; struct wfp_provider provider;
void * user_data; void * user_data;
struct lws * wsi; struct lws * wsi;
struct wf_message_queue queue; struct wf_slist messages;
}; };
extern void wfp_impl_client_protocol_init( extern void wfp_impl_client_protocol_init(