提交 a5dc3e8f authored 作者: Shane Bryldt's avatar Shane Bryldt

FS-10167: Fixed some issues on library destruction. Added another of the test…

FS-10167: Fixed some issues on library destruction. Added another of the test apps for libblade under windows. Fixed console input under tests.
上级 acd0384e
...@@ -19,6 +19,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libconfig", "..\win32\libco ...@@ -19,6 +19,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libconfig", "..\win32\libco
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blades", "test\blades.vcxproj", "{636D5B57-FC64-4A18-8D42-54209F8886BD}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blades", "test\blades.vcxproj", "{636D5B57-FC64-4A18-8D42-54209F8886BD}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bladec", "test\bladec.vcxproj", "{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
...@@ -159,6 +161,22 @@ Global ...@@ -159,6 +161,22 @@ Global
{636D5B57-FC64-4A18-8D42-54209F8886BD}.ReleaseDLL|x64.Build.0 = Release|x64 {636D5B57-FC64-4A18-8D42-54209F8886BD}.ReleaseDLL|x64.Build.0 = Release|x64
{636D5B57-FC64-4A18-8D42-54209F8886BD}.ReleaseDLL|x86.ActiveCfg = Release|Win32 {636D5B57-FC64-4A18-8D42-54209F8886BD}.ReleaseDLL|x86.ActiveCfg = Release|Win32
{636D5B57-FC64-4A18-8D42-54209F8886BD}.ReleaseDLL|x86.Build.0 = Release|Win32 {636D5B57-FC64-4A18-8D42-54209F8886BD}.ReleaseDLL|x86.Build.0 = Release|Win32
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.Debug|x64.ActiveCfg = Debug|x64
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.Debug|x64.Build.0 = Debug|x64
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.Debug|x86.ActiveCfg = Debug|Win32
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.Debug|x86.Build.0 = Debug|Win32
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.DebugDLL|x64.ActiveCfg = Debug|x64
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.DebugDLL|x64.Build.0 = Debug|x64
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.DebugDLL|x86.ActiveCfg = Debug|Win32
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.DebugDLL|x86.Build.0 = Debug|Win32
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.Release|x64.ActiveCfg = Release|x64
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.Release|x64.Build.0 = Release|x64
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.Release|x86.ActiveCfg = Release|Win32
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.Release|x86.Build.0 = Release|Win32
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.ReleaseDLL|x64.ActiveCfg = Release|x64
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.ReleaseDLL|x64.Build.0 = Release|x64
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.ReleaseDLL|x86.ActiveCfg = Release|Win32
{4A70CDA9-AC5B-4818-BCF2-B0DD1B8F5F5F}.ReleaseDLL|x86.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
......
...@@ -309,7 +309,7 @@ KS_DECLARE(ks_status_t) blade_handle_shutdown(blade_handle_t *bh) ...@@ -309,7 +309,7 @@ KS_DECLARE(ks_status_t) blade_handle_shutdown(blade_handle_t *bh)
ks_assert(bh); ks_assert(bh);
for (it = ks_hash_first(bh->requests, KS_UNLOCKED); it; it = ks_hash_next(&it)) { while ((it = ks_hash_first(bh->requests, KS_UNLOCKED))) {
void *key = NULL; void *key = NULL;
blade_request_t *value = NULL; blade_request_t *value = NULL;
...@@ -333,7 +333,7 @@ KS_DECLARE(ks_status_t) blade_handle_shutdown(blade_handle_t *bh) ...@@ -333,7 +333,7 @@ KS_DECLARE(ks_status_t) blade_handle_shutdown(blade_handle_t *bh)
// @todo call onshutdown and onunload callbacks for modules from DSOs, which will unregister transports and spaces, and will disconnect remaining // @todo call onshutdown and onunload callbacks for modules from DSOs, which will unregister transports and spaces, and will disconnect remaining
// unattached connections // unattached connections
for (it = ks_hash_first(bh->events, KS_UNLOCKED); it; it = ks_hash_next(&it)) { while ((it = ks_hash_first(bh->events, KS_UNLOCKED))) {
void *key = NULL; void *key = NULL;
blade_event_callback_t *value = NULL; blade_event_callback_t *value = NULL;
...@@ -341,7 +341,7 @@ KS_DECLARE(ks_status_t) blade_handle_shutdown(blade_handle_t *bh) ...@@ -341,7 +341,7 @@ KS_DECLARE(ks_status_t) blade_handle_shutdown(blade_handle_t *bh)
blade_handle_event_unregister(bh, (const char *)key); blade_handle_event_unregister(bh, (const char *)key);
} }
for (it = ks_hash_first(bh->spaces, KS_UNLOCKED); it; it = ks_hash_next(&it)) { while ((it = ks_hash_first(bh->spaces, KS_UNLOCKED))) {
void *key = NULL; void *key = NULL;
blade_space_t *value = NULL; blade_space_t *value = NULL;
...@@ -457,13 +457,12 @@ KS_DECLARE(ks_status_t) blade_handle_space_unregister(blade_space_t *bs) ...@@ -457,13 +457,12 @@ KS_DECLARE(ks_status_t) blade_handle_space_unregister(blade_space_t *bs)
ks_assert(path); ks_assert(path);
ks_hash_write_lock(bh->spaces); ks_hash_write_lock(bh->spaces);
bs = ks_hash_search(bh->spaces, (void *)path, KS_UNLOCKED); ks_hash_remove(bh->spaces, (void *)path);
if (bs) ks_hash_remove(bh->spaces, (void *)path);
ks_hash_write_unlock(bh->spaces); ks_hash_write_unlock(bh->spaces);
if (bs) { if (bs) {
blade_space_destroy(&bs);
ks_log(KS_LOG_DEBUG, "Space Unregistered: %s\n", path); ks_log(KS_LOG_DEBUG, "Space Unregistered: %s\n", path);
blade_space_destroy(&bs);
} }
return KS_STATUS_SUCCESS; return KS_STATUS_SUCCESS;
......
#include "blade.h" #include "blade.h"
#include "tap.h" #include "tap.h"
#ifdef _WIN32
#define STDIO_FD(_fs) _fileno(_fs)
#define READ(_fd, _buffer, _count) _read(_fd, _buffer, _count)
#else
#define STDIO_FD(_fs) fileno(_fs)
#define READ(_fd, _buffer, _count) read(_fd, _buffer, _count)
#endif
#define CONSOLE_INPUT_MAX 512 #define CONSOLE_INPUT_MAX 512
ks_bool_t g_shutdown = KS_FALSE; ks_bool_t g_shutdown = KS_FALSE;
char g_console_input[CONSOLE_INPUT_MAX];
size_t g_console_input_length = 0;
size_t g_console_input_eol = 0;
void loop(blade_handle_t *bh); void loop(blade_handle_t *bh);
void process_console_input(blade_handle_t *bh, char *line); void process_console_input(blade_handle_t *bh, char *line);
...@@ -141,56 +130,19 @@ void on_blade_session_state_callback(blade_session_t *bs, blade_session_state_co ...@@ -141,56 +130,19 @@ void on_blade_session_state_callback(blade_session_t *bs, blade_session_state_co
} }
} }
void buffer_console_input(void)
{
ssize_t bytes = 0;
struct pollfd poll[1];
poll[0].fd = STDIO_FD(stdin);
poll[0].events = POLLIN | POLLERR;
if (ks_poll(poll, 1, 1) > 0) {
if (poll[0].revents & POLLIN) {
if ((bytes = READ(poll[0].fd, g_console_input + g_console_input_length, CONSOLE_INPUT_MAX - g_console_input_length)) <= 0) {
// @todo error
return;
}
g_console_input_length += bytes;
}
}
}
void loop(blade_handle_t *bh) void loop(blade_handle_t *bh)
{ {
char buf[CONSOLE_INPUT_MAX];
while (!g_shutdown) { while (!g_shutdown) {
ks_bool_t eol = KS_FALSE; if (!fgets(buf, CONSOLE_INPUT_MAX, stdin)) break;
buffer_console_input();
for (; g_console_input_eol < g_console_input_length; ++g_console_input_eol) { for (int index = 0; buf[index]; ++index) {
char c = g_console_input[g_console_input_eol]; if (buf[index] == '\r' || buf[index] == '\n') {
if (c == '\r' || c == '\n') { buf[index] = '\0';
eol = KS_TRUE;
break; break;
} }
} }
if (eol) { process_console_input(bh, buf);
g_console_input[g_console_input_eol] = '\0';
process_console_input(bh, g_console_input);
g_console_input_eol++;
for (; g_console_input_eol < g_console_input_length; ++g_console_input_eol) {
char c = g_console_input[g_console_input_eol];
if (c != '\r' && c != '\n') break;
}
if (g_console_input_eol == g_console_input_length) g_console_input_eol = g_console_input_length = 0;
else {
memcpy(g_console_input, g_console_input + g_console_input_eol, g_console_input_length - g_console_input_eol);
g_console_input_length -= g_console_input_eol;
g_console_input_eol = 0;
}
}
if (g_console_input_length == CONSOLE_INPUT_MAX) {
// @todo lines must not exceed 512 bytes, treat as error and ignore buffer until next new line?
ks_assert(0);
}
} }
} }
......
差异被折叠。
#include "blade.h" #include "blade.h"
#include "tap.h" #include "tap.h"
#ifdef _WIN32
#define STDIO_FD(_fs) _fileno(_fs)
#define READ(_fd, _buffer, _count) _read(_fd, _buffer, _count)
#else
#define STDIO_FD(_fs) fileno(_fs)
#define READ(_fd, _buffer, _count) read(_fd, _buffer, _count)
#endif
#define CONSOLE_INPUT_MAX 512 #define CONSOLE_INPUT_MAX 512
ks_bool_t g_shutdown = KS_FALSE; ks_bool_t g_shutdown = KS_FALSE;
char g_console_input[CONSOLE_INPUT_MAX];
size_t g_console_input_length = 0;
size_t g_console_input_eol = 0;
void loop(blade_handle_t *bh); void loop(blade_handle_t *bh);
void process_console_input(blade_handle_t *bh, char *line); void process_console_input(blade_handle_t *bh, char *line);
...@@ -102,58 +91,19 @@ int main(int argc, char **argv) ...@@ -102,58 +91,19 @@ int main(int argc, char **argv)
return 0; return 0;
} }
void buffer_console_input(void)
{
ssize_t bytes = 0;
struct pollfd poll[1];
poll[0].fd = STDIO_FD(stdin);
poll[0].events = POLLIN | POLLERR;
if (ks_poll(poll, 1, 1) > 0) {
if (poll[0].revents & POLLIN) {
if ((bytes = READ(poll[0].fd, g_console_input + g_console_input_length, CONSOLE_INPUT_MAX - g_console_input_length)) <= 0) {
// @todo error
return;
}
g_console_input_length += bytes;
}
}
}
void loop(blade_handle_t *bh) void loop(blade_handle_t *bh)
{ {
char buf[CONSOLE_INPUT_MAX];
while (!g_shutdown) { while (!g_shutdown) {
ks_bool_t eol = KS_FALSE; if (!fgets(buf, CONSOLE_INPUT_MAX, stdin)) break;
buffer_console_input();
for (; g_console_input_eol < g_console_input_length; ++g_console_input_eol) { for (int index = 0; buf[index]; ++index) {
char c = g_console_input[g_console_input_eol]; if (buf[index] == '\r' || buf[index] == '\n') {
if (c == '\r' || c == '\n') { buf[index] = '\0';
eol = KS_TRUE;
break; break;
} }
} }
if (eol) { process_console_input(bh, buf);
g_console_input[g_console_input_eol] = '\0';
process_console_input(bh, g_console_input);
g_console_input_eol++;
for (; g_console_input_eol < g_console_input_length; ++g_console_input_eol) {
char c = g_console_input[g_console_input_eol];
if (c != '\r' && c != '\n') break;
}
if (g_console_input_eol == g_console_input_length) g_console_input_eol = g_console_input_length = 0;
else {
memcpy(g_console_input, g_console_input + g_console_input_eol, g_console_input_length - g_console_input_eol);
g_console_input_length -= g_console_input_eol;
g_console_input_eol = 0;
}
}
if (g_console_input_length == CONSOLE_INPUT_MAX) {
// @todo lines must not exceed 512 bytes, treat as error and ignore buffer until next new line?
ks_assert(0);
}
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论