From d2f078298eb5610a4a3a8c8445d9d9141d4c77fd Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sat, 7 Mar 2020 15:27:04 +0100 Subject: [PATCH] added function to interrupt _service calls --- include/webfuse/adapter/server.h | 18 +++++++++++++++++- include/webfuse/provider/client.h | 18 +++++++++++++++++- lib/webfuse/adapter/api.c | 13 +++++++++++-- lib/webfuse/adapter/impl/server.c | 12 +++++++++--- lib/webfuse/adapter/impl/server.h | 6 ++++-- lib/webfuse/provider/api.c | 13 +++++++++++-- lib/webfuse/provider/impl/client.c | 10 +++++++--- lib/webfuse/provider/impl/client.h | 6 ++++-- 8 files changed, 80 insertions(+), 16 deletions(-) diff --git a/include/webfuse/adapter/server.h b/include/webfuse/adapter/server.h index 8e392ac..150ded5 100644 --- a/include/webfuse/adapter/server.h +++ b/include/webfuse/adapter/server.h @@ -46,13 +46,29 @@ extern WF_API void wf_server_dispose( /// This function must be invoked in a loop while the server is running. It /// makes the server wait for the next event and processes it. /// +/// \note timeout_ms is no longer used +/// /// \param server pointer to server -/// \param timeout_ms timeout in milliseconds. +/// \param timeout_ms unused; set to 0; used for backward compatibility +/// +/// \see wf_server_interrupt //------------------------------------------------------------------------------ extern WF_API void wf_server_service( struct wf_server * server, int timeout_ms); +//------------------------------------------------------------------------------ +/// \brief Interrupts wf_server_service +/// +/// This function can be used from another thread. +/// +/// \param server pointer to server +/// +/// \see wf_server_service +//------------------------------------------------------------------------------ +extern WF_API void wf_server_interrupt( + struct wf_server * server); + #ifdef __cplusplus } #endif diff --git a/include/webfuse/provider/client.h b/include/webfuse/provider/client.h index b78fc4a..0f6ba4f 100644 --- a/include/webfuse/provider/client.h +++ b/include/webfuse/provider/client.h @@ -78,13 +78,29 @@ extern WFP_API void wfp_client_dispose( /// This function must be invoked in a loop while the client is running. It /// makes the server wait for the next event and processes it. /// +/// \note timeout is ignored +/// /// \param client pointer to client -/// \param timeout_ms timeout in milliseconds. +/// \param timeout_ms unused; set to 0; for backward compatibilty +/// +/// \see wfp_client_interrupt //------------------------------------------------------------------------------ extern WFP_API void wfp_client_service( struct wfp_client * client, int timeout_ms); +//------------------------------------------------------------------------------ +/// \brief interrupt wfp_client_service +/// +/// This function can be called from another thread. +/// +/// \param client pointer to client +/// +/// \see wfp_client_service +//------------------------------------------------------------------------------ +extern WFP_API void wfp_client_interrupt( + struct wfp_client * client); + #ifdef __cplusplus } #endif diff --git a/lib/webfuse/adapter/api.c b/lib/webfuse/adapter/api.c index adecac2..2047029 100644 --- a/lib/webfuse/adapter/api.c +++ b/lib/webfuse/adapter/api.c @@ -6,6 +6,8 @@ #include "webfuse/adapter/impl/credentials.h" #include "webfuse/adapter/impl/mountpoint.h" +#include "webfuse/core/util.h" + // server struct wf_server * wf_server_create( @@ -22,11 +24,18 @@ void wf_server_dispose( void wf_server_service( struct wf_server * server, - int timeout_ms) + int WF_UNUSED_PARAM(imeout_ms)) +{ + wf_impl_server_service(server); +} + +void wf_server_interrupt( + struct wf_server * server) { - wf_impl_server_service(server, timeout_ms); + wf_impl_server_interrupt(server); } + // server protocol struct wf_server_protocol * wf_server_protocol_create( diff --git a/lib/webfuse/adapter/impl/server.c b/lib/webfuse/adapter/impl/server.c index bf32b85..f6e1f63 100644 --- a/lib/webfuse/adapter/impl/server.c +++ b/lib/webfuse/adapter/impl/server.c @@ -111,8 +111,14 @@ bool wf_impl_server_is_operational( } void wf_impl_server_service( - struct wf_server * server, - int timeout_ms) + struct wf_server * server) +{ + lws_service(server->context, 0); +} + +void wf_impl_server_interrupt( + struct wf_server * server) { - lws_service(server->context, timeout_ms); + lws_cancel_service(server->context); } + diff --git a/lib/webfuse/adapter/impl/server.h b/lib/webfuse/adapter/impl/server.h index 1f04cc7..56dab8d 100644 --- a/lib/webfuse/adapter/impl/server.h +++ b/lib/webfuse/adapter/impl/server.h @@ -23,8 +23,10 @@ extern bool wf_impl_server_is_operational( struct wf_server * server); extern void wf_impl_server_service( - struct wf_server * server, - int timeout_ms); + struct wf_server * server); + +extern void wf_impl_server_interrupt( + struct wf_server * server); #ifdef __cplusplus } diff --git a/lib/webfuse/provider/api.c b/lib/webfuse/provider/api.c index 7c3220b..0704095 100644 --- a/lib/webfuse/provider/api.c +++ b/lib/webfuse/provider/api.c @@ -13,6 +13,8 @@ #include "webfuse/provider/impl/dirbuffer.h" #include "webfuse/provider/impl/credentials.h" +#include "webfuse/core/util.h" + // respond void wfp_respond_error( @@ -223,11 +225,18 @@ void wfp_client_dispose( void wfp_client_service( struct wfp_client * client, - int timeout_ms) + int WF_UNUSED_PARAM(timeout_ms)) +{ + wfp_impl_client_service(client); +} + +void wfp_client_interrupt( + struct wfp_client * client) { - wfp_impl_client_service(client, timeout_ms); + wfp_impl_client_interrupt(client); } + // dirbuffer struct wfp_dirbuffer * wfp_dirbuffer_create(void) diff --git a/lib/webfuse/provider/impl/client.c b/lib/webfuse/provider/impl/client.c index 4ddae92..21af148 100644 --- a/lib/webfuse/provider/impl/client.c +++ b/lib/webfuse/provider/impl/client.c @@ -84,9 +84,13 @@ bool wfp_impl_client_is_connected( } void wfp_impl_client_service( - struct wfp_client * client, - int timeout_ms) + struct wfp_client * client) { - lws_service(client->context, timeout_ms); + lws_service(client->context, 0); } +void wfp_impl_client_interrupt( + struct wfp_client * client) +{ + lws_cancel_service(client->context); +} diff --git a/lib/webfuse/provider/impl/client.h b/lib/webfuse/provider/impl/client.h index 4ade5f2..46e41f9 100644 --- a/lib/webfuse/provider/impl/client.h +++ b/lib/webfuse/provider/impl/client.h @@ -38,8 +38,10 @@ extern bool wfp_impl_client_is_connected( struct wfp_client * client); extern void wfp_impl_client_service( - struct wfp_client * client, - int timeout_ms); + struct wfp_client * client); + +extern void wfp_impl_client_interrupt( + struct wfp_client * client); #ifdef __cplusplus }