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:
parent
11e45789ba
commit
11565d22ad
@ -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,24 +51,41 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ConnectionState::connected == connection_state)
|
||||||
|
{
|
||||||
thread = std::thread(Run, this);
|
thread = std::thread(Run, this);
|
||||||
std::this_thread::sleep_for(200ms);
|
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()
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user