diff --git a/libs/libblade/src/blade_connection.c b/libs/libblade/src/blade_connection.c
index 3a71234c0e..a8df9af3fc 100644
--- a/libs/libblade/src/blade_connection.c
+++ b/libs/libblade/src/blade_connection.c
@@ -43,6 +43,8 @@ struct blade_connection_s {
blade_connection_direction_t direction;
volatile blade_connection_state_t state;
+ ks_cond_t *cond;
+
const char *id;
ks_rwl_t *lock;
@@ -99,6 +101,9 @@ KS_DECLARE(ks_status_t) blade_connection_create(blade_connection_t **bcP, blade_
bc->handle = bh;
bc->pool = pool;
+ ks_cond_create(&bc->cond, pool);
+ ks_assert(bc->cond);
+
ks_uuid(&id);
bc->id = ks_uuid_str(pool, &id);
ks_assert(bc->id);
@@ -292,13 +297,19 @@ KS_DECLARE(void) blade_connection_state_set(blade_connection_t *bc, blade_connec
ks_assert(bc);
+ ks_cond_lock(bc->cond);
+
callback = blade_connection_state_callback_lookup(bc, state);
if (callback) hook = callback(bc, BLADE_CONNECTION_STATE_CONDITION_PRE);
bc->state = state;
+ ks_cond_unlock(bc->cond);
+
if (hook == BLADE_CONNECTION_STATE_HOOK_DISCONNECT) blade_connection_disconnect(bc);
+
+ ks_cond_try_signal(bc->cond);
}
KS_DECLARE(blade_connection_state_t) blade_connection_state_get(blade_connection_t *bc)
@@ -362,7 +373,12 @@ void *blade_connection_state_thread(ks_thread_t *thread, void *data)
bc = (blade_connection_t *)data;
+ ks_cond_lock(bc->cond);
while (!shutdown) {
+ // Entering the call below, the mutex is expected to be locked and will be unlocked by the call
+ ks_cond_timedwait(bc->cond, 100);
+ // Leaving the call above, the mutex will be locked after being signalled, timing out, or woken up for any reason
+
state = bc->state;
switch (state) {
@@ -388,6 +404,7 @@ void *blade_connection_state_thread(ks_thread_t *thread, void *data)
default: break;
}
}
+ ks_cond_unlock(bc->cond);
blade_connection_destroy(&bc);
diff --git a/libs/libblade/src/blade_module_wss.c b/libs/libblade/src/blade_module_wss.c
index d4ab63fe76..1a56f51a89 100644
--- a/libs/libblade/src/blade_module_wss.c
+++ b/libs/libblade/src/blade_module_wss.c
@@ -656,7 +656,7 @@ ks_status_t blade_transport_wss_on_send(blade_connection_t *bc, cJSON *json)
ks_status_t blade_transport_wss_read(blade_transport_wss_t *bt_wss, cJSON **json)
{
// @todo get exact timeout from service config?
- int32_t poll_flags = ks_wait_sock(bt_wss->sock, 100, KS_POLL_READ); // | KS_POLL_ERROR);
+ int32_t poll_flags = ks_wait_sock(bt_wss->sock, 1, KS_POLL_READ); // | KS_POLL_ERROR);
*json = NULL;
diff --git a/libs/libblade/src/blade_session.c b/libs/libblade/src/blade_session.c
index 667687d68b..c08a0a1062 100644
--- a/libs/libblade/src/blade_session.c
+++ b/libs/libblade/src/blade_session.c
@@ -42,7 +42,6 @@ struct blade_session_s {
const char *id;
ks_rwl_t *lock;
- ks_mutex_t *mutex;
ks_cond_t *cond;
ks_list_t *connections;
@@ -87,7 +86,6 @@ static void blade_session_cleanup(ks_pool_t *pool, void *ptr, void *arg, ks_pool
bs->sending = NULL;
bs->connections = NULL;
bs->cond = NULL;
- bs->mutex = NULL;
bs->lock = NULL;
//ks_pool_free(bs->pool, &bs->id);
@@ -122,9 +120,7 @@ KS_DECLARE(ks_status_t) blade_session_create(blade_session_t **bsP, blade_handle
ks_rwl_create(&bs->lock, pool);
ks_assert(bs->lock);
- ks_mutex_create(&bs->mutex, KS_MUTEX_FLAG_DEFAULT, pool);
- ks_assert(bs->mutex);
- ks_cond_create_ex(&bs->cond, pool, bs->mutex);
+ ks_cond_create(&bs->cond, pool);
ks_assert(bs->cond);
ks_list_create(&bs->connections, pool);
@@ -311,13 +307,11 @@ KS_DECLARE(void) blade_session_state_set(blade_session_t *bs, blade_session_stat
{
ks_assert(bs);
- ks_mutex_lock(bs->mutex);
-
+ ks_cond_lock(bs->cond);
bs->state = state;
-
blade_handle_session_state_callbacks_execute(bs, BLADE_SESSION_STATE_CONDITION_PRE);
+ ks_cond_unlock(bs->cond);
- ks_mutex_unlock(bs->mutex);
ks_cond_try_signal(bs->cond);
}
@@ -469,8 +463,7 @@ void *blade_session_state_thread(ks_thread_t *thread, void *data)
bs = (blade_session_t *)data;
- ks_mutex_lock(bs->mutex);
-
+ ks_cond_lock(bs->cond);
while (!shutdown) {
// Entering the call below, the mutex is expected to be locked and will be unlocked by the call
ks_cond_timedwait(bs->cond, 100);
@@ -524,7 +517,7 @@ void *blade_session_state_thread(ks_thread_t *thread, void *data)
blade_session_hangup(bs);
}
}
- ks_mutex_unlock(bs->mutex);
+ ks_cond_unlock(bs->cond);
blade_session_destroy(&bs);
diff --git a/libs/libblade/test/bladec.c b/libs/libblade/test/bladec.c
index 1ec80eb26b..831eaced4d 100644
--- a/libs/libblade/test/bladec.c
+++ b/libs/libblade/test/bladec.c
@@ -38,6 +38,7 @@ int main(int argc, char **argv)
config_setting_t *config_blade = NULL;
const char *cfgpath = "bladec.cfg";
const char *session_state_callback_id = NULL;
+ const char *autoconnect = NULL;
ks_global_set_default_logger(KS_LOG_LEVEL_DEBUG);
@@ -45,7 +46,8 @@ int main(int argc, char **argv)
blade_handle_create(&bh);
- if (argc > 1) cfgpath = argv[1];
+ //if (argc > 1) cfgpath = argv[1];
+ if (argc > 1) autoconnect = argv[1];
config_init(&config);
if (!config_read_file(&config, cfgpath)) {
@@ -72,7 +74,18 @@ int main(int argc, char **argv)
blade_handle_event_register(bh, "blade.chat.message", on_blade_chat_message_event);
blade_handle_session_state_callback_register(bh, NULL, on_blade_session_state_callback, &session_state_callback_id);
- loop(bh);
+ if (autoconnect) {
+ blade_connection_t *bc = NULL;
+ blade_identity_t *target = NULL;
+
+ blade_identity_create(&target, blade_handle_pool_get(bh));
+
+ if (blade_identity_parse(target, autoconnect) == KS_STATUS_SUCCESS) blade_handle_connect(bh, &bc, target, NULL);
+
+ blade_identity_destroy(&target);
+
+ ks_sleep_ms(2000);
+ } else loop(bh);
//blade_handle_session_state_callback_unregister(bh, session_state_callback_id);
@@ -197,9 +210,32 @@ void command_connect(blade_handle_t *bh, char *args)
blade_identity_destroy(&target);
}
+ks_bool_t on_blade_chat_send_response(blade_response_t *bres);
+
ks_bool_t on_blade_chat_join_response(blade_response_t *bres) // @todo this should get userdata passed in from when the callback is registered
{
+ blade_session_t *bs = NULL;
+ cJSON *req = NULL;
+ cJSON *params = NULL;
+
ks_log(KS_LOG_DEBUG, "Received Chat Join Response!\n");
+
+ bs = blade_handle_sessions_get(bres->handle, bres->session_id);
+ if (!bs) {
+ ks_log(KS_LOG_DEBUG, "Unknown Session: %s\n", bres->session_id);
+ return KS_FALSE;
+ }
+
+ blade_rpc_request_create(blade_handle_pool_get(bres->handle), &req, ¶ms, NULL, "blade.chat.send");
+ ks_assert(req);
+ ks_assert(params);
+
+ cJSON_AddStringToObject(params, "message", "Hello World!");
+
+ blade_session_send(bs, req, on_blade_chat_send_response);
+
+ blade_session_read_unlock(bs);
+
return KS_FALSE;
}
diff --git a/libs/libblade/test/blades.c b/libs/libblade/test/blades.c
index 34251309ac..5659477258 100644
--- a/libs/libblade/test/blades.c
+++ b/libs/libblade/test/blades.c
@@ -70,7 +70,7 @@ int main(int argc, char **argv)
blade_handle_create(&bh);
- if (argc > 1) cfgpath = argv[1];
+ //if (argc > 1) cfgpath = argv[1];
config_init(&config);
if (!config_read_file(&config, cfgpath)) {
diff --git a/libs/win32/libsodium/libsodium.2015.vcxproj b/libs/win32/libsodium/libsodium.2015.vcxproj
index e12109e020..c9d706525e 100644
--- a/libs/win32/libsodium/libsodium.2015.vcxproj
+++ b/libs/win32/libsodium/libsodium.2015.vcxproj
@@ -315,12 +315,14 @@
MultiThreadedDLL
false
/arch:AVX %(AdditionalOptions)
+ true
Console
true
true
true
+ true