1
0
mirror of https://github.com/falk-werner/webfuse synced 2024-10-27 20:34:10 +00:00

fix: prevent deadlock if libfuse is not available at runtime

This commit is contained in:
Falk Werner 2020-06-06 10:59:06 +02:00
parent 11e45789ba
commit 11565d22ad
3 changed files with 80 additions and 4 deletions

View File

@ -9,6 +9,39 @@
using namespace std::chrono_literals; using namespace std::chrono_literals;
namespace
{
enum class ConnectionState
{
disconnected,
connected,
connecting
};
}
extern "C"
{
void
webfuse_test_provider_onconnected(
void * user_data)
{
auto * fs = reinterpret_cast<wfp_static_filesystem*>(user_data);
auto * connection_state = reinterpret_cast<ConnectionState*>(wfp_static_filesystem_get_user_data(fs));
*connection_state = ConnectionState::connected;
}
void
webfuse_test_provider_ondisconnected(
void * user_data)
{
auto * fs = reinterpret_cast<wfp_static_filesystem*>(user_data);
auto * connection_state = reinterpret_cast<ConnectionState*>(wfp_static_filesystem_get_user_data(fs));
*connection_state = ConnectionState::disconnected;
}
}
namespace webfuse_test namespace webfuse_test
{ {
@ -18,23 +51,40 @@ public:
explicit Private(char const * url) explicit Private(char const * url)
: is_shutdown_requested(false) : is_shutdown_requested(false)
{ {
ConnectionState connection_state = ConnectionState::connecting;
config = wfp_client_config_create(); config = wfp_client_config_create();
wfp_client_config_set_certpath(config, "client-cert.pem"); wfp_client_config_set_certpath(config, "client-cert.pem");
wfp_client_config_set_keypath(config, "client-key.pem"); wfp_client_config_set_keypath(config, "client-key.pem");
wfp_client_config_set_ca_filepath(config, "server-cert.pem"); wfp_client_config_set_ca_filepath(config, "server-cert.pem");
wfp_client_config_set_onconnected(config, &webfuse_test_provider_onconnected);
wfp_client_config_set_ondisconnected(config, &webfuse_test_provider_ondisconnected);
fs = wfp_static_filesystem_create(config); fs = wfp_static_filesystem_create(config);
wfp_static_filesystem_set_user_data(fs, reinterpret_cast<void*>(&connection_state));
wfp_static_filesystem_add_text(fs, "hello.txt", 0444, "Hello, World"); wfp_static_filesystem_add_text(fs, "hello.txt", 0444, "Hello, World");
client = wfp_client_create(config); client = wfp_client_create(config);
wfp_client_connect(client, url); wfp_client_connect(client, url);
while (!wfp_impl_client_is_connected(client)) while (ConnectionState::connecting == connection_state)
{ {
wfp_client_service(client); wfp_client_service(client);
} }
thread = std::thread(Run, this); if (ConnectionState::connected == connection_state)
std::this_thread::sleep_for(200ms); {
thread = std::thread(Run, this);
std::this_thread::sleep_for(200ms);
}
else
{
wfp_client_dispose(client);
wfp_static_filesystem_dispose(fs);
wfp_client_config_dispose(config);
throw std::runtime_error("unable to connect");
}
} }
~Private() ~Private()

View File

@ -38,6 +38,7 @@ struct wfp_static_filesystem
struct wfp_static_filesystem_entry * entries; struct wfp_static_filesystem_entry * entries;
size_t size; size_t size;
size_t capacity; size_t capacity;
void * user_data;
}; };
static struct wfp_static_filesystem_entry * static struct wfp_static_filesystem_entry *
@ -335,6 +336,7 @@ wfp_static_filesystem_create(
filesystem->entries = malloc(sizeof(struct wfp_static_filesystem_entry) * WFP_STATIC_FILESYSTEM_DEFAULT_CAPACITY); filesystem->entries = malloc(sizeof(struct wfp_static_filesystem_entry) * WFP_STATIC_FILESYSTEM_DEFAULT_CAPACITY);
filesystem->size = 0; filesystem->size = 0;
filesystem->capacity = WFP_STATIC_FILESYSTEM_DEFAULT_CAPACITY; filesystem->capacity = WFP_STATIC_FILESYSTEM_DEFAULT_CAPACITY;
filesystem->user_data = NULL;
wfp_static_filesystem_add_dir(filesystem, 0, "<root>"); wfp_static_filesystem_add_dir(filesystem, 0, "<root>");
@ -402,3 +404,18 @@ wfp_static_filesystem_add_text(
size_t length = strlen(content); size_t length = strlen(content);
wfp_static_filesystem_add(filesystem, path, mode, content, length); wfp_static_filesystem_add(filesystem, path, mode, content, length);
} }
void
wfp_static_filesystem_set_user_data(
struct wfp_static_filesystem * filesystem,
void * user_data)
{
filesystem->user_data = user_data;
}
void *
wfp_static_filesystem_get_user_data(
struct wfp_static_filesystem * filesystem)
{
return filesystem->user_data;
}

View File

@ -56,6 +56,15 @@ wfp_static_filesystem_add_text(
int mode, int mode,
char const * content); char const * content);
extern void
wfp_static_filesystem_set_user_data(
struct wfp_static_filesystem * filesystem,
void * user_data);
extern void *
wfp_static_filesystem_get_user_data(
struct wfp_static_filesystem * filesystem);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif