This repository was archived by the owner on Apr 6, 2019. It is now read-only.
This repository was archived by the owner on Apr 6, 2019. It is now read-only.
cpp_redis on Windows, WSACleanup #178
Open
Description
Hi, i compiled cpp_redis with tacopie to dll via cmake (cmake -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DBUILD_SHARED_LIBS=TRUE -DLOGGING_ENABLED=1 -DMSVC_RUNTIME_LIBRARY_CONFIG=/MTd -G "Visual Studio 15 2017 Win64" -DCMAKE_CXX_STANDARD=11) using visual studio 17 on WINDOWS 10.
The code sample is the following:
#include <cpp_redis/cpp_redis>
#include <iostream>
#ifdef _WIN32
#include <Winsock2.h>
#endif /* _WIN32 */
int
main(void) {
#ifdef _WIN32
//! Windows netword DLL init
WORD version = MAKEWORD(2, 2);
WSADATA data;
if (WSAStartup(version, &data) != 0) {
std::cerr << "WSAStartup() failure" << std::endl;
return -1;
}
#endif /* _WIN32 */
//! Enable logging
cpp_redis::client client;
client.client_setname("redis");
client.select(1);
client.connect("192.168.31.166", 6379, [](const std::string& host, std::size_t port, cpp_redis::client::connect_state status) {
if (status == cpp_redis::client::connect_state::dropped) {
std::cout << "client disconnected from " << host << ":" << port << std::endl;
}
});
// same as client.send({ "SET", "hello", "42" }, ...)
client.set("hello", "42", [](cpp_redis::reply& reply) {
std::cout << "set hello 42: " << reply << std::endl;
});
// same as client.send({ "DECRBY", "hello", 12 }, ...)
client.decrby("hello", 12, [](cpp_redis::reply& reply) {
std::cout << "decrby hello 12: " << reply << std::endl;
});
// same as client.send({ "GET", "hello" }, ...)
client.get("hello", [](cpp_redis::reply& reply) {
std::cout << "get hello: " << reply << std::endl;
});
client.sync_commit();
client.disconnect(true);
#ifdef _WIN32
WSACleanup();
#endif /* _WIN32 */
return 0;
}
output error:
f:\dd\vctools\crt\crtw32\stdcpp\thr\mutex.c(51): mutex destroyed while busy
stack trace:
cpp_redisD.dll!issue_debug_notification(const wchar_t * const message) Line 28 C++ Symbols loaded.
cpp_redisD.dll!__acrt_report_runtime_error(const wchar_t * message) Line 154 C++ Symbols loaded.
cpp_redisD.dll!abort() Line 61 C++ Symbols loaded.
> cpp_redisD.dll!_Thrd_abort(const char * msg) Line 119 C Non-user code. Symbols loaded.
cpp_redisD.dll!_Mtx_destroy_in_situ(_Mtx_internal_imp_t * mtx) Line 52 C++ Non-user code. Symbols loaded.
cpp_redisD.dll!std::_Mutex_base::~_Mutex_base() Line 41 C++ Non-user code. Symbols loaded.
cpp_redisD.dll!std::mutex::~mutex() C++ Non-user code. Symbols loaded.
cpp_redisD.dll!tacopie::io_service::~io_service() Line 85 C++ Symbols loaded.
cpp_redisD.dll!tacopie::io_service::`scalar deleting destructor'(unsigned int) C++ Non-user code. Symbols loaded.
cpp_redisD.dll!std::_Ref_count_obj<tacopie::io_service>::_Destroy() Line 1860 C++ Non-user code. Symbols loaded.
cpp_redisD.dll!std::_Ref_count_base::_Decref() Line 895 C++ Non-user code. Symbols loaded.
cpp_redisD.dll!std::_Ptr_base<tacopie::io_service>::_Decref() Line 1169 C++ Non-user code. Symbols loaded.
cpp_redisD.dll!std::shared_ptr<tacopie::io_service>::~shared_ptr<tacopie::io_service>() Line 1460 C++ Non-user code. Symbols loaded.
cpp_redisD.dll!tacopie::`dynamic atexit destructor for 'io_service_default_instance''() C++ Non-user code. Symbols loaded.
cpp_redisD.dll!_execute_onexit_table::__l2::<lambda>() Line 206 C++ Symbols loaded.
cpp_redisD.dll!__crt_seh_guarded_call<int>::operator()<void <lambda>(void),int <lambda>(void) & __ptr64,void <lambda>(void) >(__acrt_lock_and_call::__l2::void <lambda>(void) && setup, _execute_onexit_table::__l2::int <lambda>(void) & action, __acrt_lock_and_call::__l2::void <lambda>(void) && cleanup) Line 204 C++ Symbols loaded.
cpp_redisD.dll!__acrt_lock_and_call<int <lambda>(void) >(const __acrt_lock_id lock_id, _execute_onexit_table::__l2::int <lambda>(void) && action) Line 940 C++ Symbols loaded.
cpp_redisD.dll!_execute_onexit_table(_onexit_table_t * table) Line 231 C++ Symbols loaded.
cpp_redisD.dll!common_exit::__l2::<lambda>() Line 226 C++ Symbols loaded.
cpp_redisD.dll!__crt_seh_guarded_call<void>::operator()<void <lambda>(void),void <lambda>(void) & __ptr64,void <lambda>(void) >(__acrt_lock_and_call::__l2::void <lambda>(void) && setup, common_exit::__l2::void <lambda>(void) & action, __acrt_lock_and_call::__l2::void <lambda>(void) && cleanup) Line 224 C++ Symbols loaded.
cpp_redisD.dll!__acrt_lock_and_call<void <lambda>(void) >(const __acrt_lock_id lock_id, common_exit::__l2::void <lambda>(void) && action) Line 940 C++ Symbols loaded.
cpp_redisD.dll!common_exit(const int return_code, const _crt_exit_cleanup_mode cleanup_mode, const _crt_exit_return_mode return_mode) Line 259 C++ Symbols loaded.
cpp_redisD.dll!_cexit() Line 314 C++ Symbols loaded.
cpp_redisD.dll!__scrt_dllmain_uninitialize_c() Line 407 C++ Non-user code. Symbols loaded.
cpp_redisD.dll!dllmain_crt_process_detach(const bool is_terminating) Line 107 C++ Non-user code. Symbols loaded.
cpp_redisD.dll!dllmain_crt_dispatch(HINSTANCE__ * const instance, const unsigned long reason, void * const reserved) Line 138 C++ Non-user code. Symbols loaded.
cpp_redisD.dll!dllmain_dispatch(HINSTANCE__ * const instance, const unsigned long reason, void * const reserved) Line 211 C++ Non-user code. Symbols loaded.
cpp_redisD.dll!_DllMainCRTStartup(HINSTANCE__ * const instance, const unsigned long reason, void * const reserved) Line 253 C++ Non-user code. Symbols loaded.
ntdll.dll!LdrpCallInitRoutine() Unknown Non-user code. Symbols loaded.
ntdll.dll!LdrShutdownProcess() Unknown Non-user code. Symbols loaded.
ntdll.dll!RtlExitUserProcess() Unknown Non-user code. Symbols loaded.
kernel32.dll!ExitProcessImplementation�() Unknown Non-user code. Symbols loaded.
RedisTest.exe!exit_or_terminate_process(const unsigned int return_code) Line 144 C++ Symbols loaded.
RedisTest.exe!common_exit(const int return_code, const _crt_exit_cleanup_mode cleanup_mode, const _crt_exit_return_mode return_mode) Line 282 C++ Symbols loaded.
RedisTest.exe!exit(int return_code) Line 294 C++ Symbols loaded.
RedisTest.exe!__scrt_common_main_seh() Line 292 C++ Non-user code. Symbols loaded.
RedisTest.exe!__scrt_common_main() Line 326 C++ Non-user code. Symbols loaded.
RedisTest.exe!mainCRTStartup() Line 17 C++ Non-user code. Symbols loaded.
kernel32.dll!BaseThreadInitThunk�() Unknown Non-user code. Symbols loaded.
ntdll.dll!RtlUserThreadStart�() Unknown Non-user code. Symbols loaded.
i deleted this code
#ifdef _WIN32
WSACleanup();
#endif /* _WIN32 */
and this resolved my problem
Question: why WSAStartup and WSACleanup are not implemented inside tacopie? Why the singleton (io_service_default_instance) is not freed during disconnect(true)? Is there any posibility to shutdown tcp client (tacopie) on demand?
Metadata
Metadata
Assignees
Labels
No labels