1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-30 00:00:16 +01:00

windows: work well with vcpkg pthreads

This commit is contained in:
Mykola Stryebkov 2021-04-04 18:50:05 +01:00 committed by Andy Green
parent 3c334d4906
commit 0d06d4bad2
6 changed files with 56 additions and 8 deletions

View file

@ -274,7 +274,7 @@ endif()
#endif() #endif()
if (WIN32) if (WIN32)
set(LWS_MAX_SMP 1) #set(LWS_MAX_SMP 1)
if (LWS_WITH_PLUGINS) if (LWS_WITH_PLUGINS)
set(LWS_WITH_LIBUV_INTERNAL 1) set(LWS_WITH_LIBUV_INTERNAL 1)
endif() endif()
@ -414,6 +414,7 @@ if (LWS_WITH_PLUGINS OR (LWS_WITH_EVLIB_PLUGINS AND LWS_WITH_EVENT_LIBS))
endif() endif()
if (WIN32 AND NOT LWS_EXT_PTHREAD_LIBRARIES) if (WIN32 AND NOT LWS_EXT_PTHREAD_LIBRARIES)
set(LWS_MAX_SMP 1)
message("SMD requires pthreads") message("SMD requires pthreads")
set(LWS_WITH_SYS_SMD 0) set(LWS_WITH_SYS_SMD 0)
endif() endif()

View file

@ -659,7 +659,11 @@ if (LWS_HAVE_PTHREAD_H AND NOT LWS_PLAT_FREERTOS)
#endif #endif
#include <pthread.h> #include <pthread.h>
int main(void) { int main(void) {
#ifdef __PTW32_H
pthread_t th = {0,0};
#else
pthread_t th = 0; pthread_t th = 0;
#endif
pthread_setname_np(th, NULL); pthread_setname_np(th, NULL);
return 0; return 0;
}" LWS_HAS_PTHREAD_SETNAME_NP) }" LWS_HAS_PTHREAD_SETNAME_NP)

View file

@ -845,7 +845,13 @@ lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason,
#if LWS_MAX_SMP > 1 #if LWS_MAX_SMP > 1
case LWS_CALLBACK_GET_THREAD_ID: case LWS_CALLBACK_GET_THREAD_ID:
#ifdef __PTW32_H
/* If we use implementation of PThreads for Win that is
* distributed by VCPKG */
return (int)(lws_intptr_t)(pthread_self()).p;
#else
return (int)(lws_intptr_t)pthread_self(); return (int)(lws_intptr_t)pthread_self();
#endif // __PTW32_H
#endif #endif
default: default:

View file

@ -1250,7 +1250,13 @@ lws_mutex_refcount_init(struct lws_mutex_refcount *mr)
mr->last_lock_reason = NULL; mr->last_lock_reason = NULL;
mr->lock_depth = 0; mr->lock_depth = 0;
mr->metadata = 0; mr->metadata = 0;
#ifdef __PTW32_H
/* If we use implementation of PThreads for Win that is
* distributed by VCPKG */
memset(&mr->lock_owner, 0, sizeof(pthread_t));
#else
mr->lock_owner = 0; mr->lock_owner = 0;
#endif
} }
void void
@ -1272,7 +1278,14 @@ lws_mutex_refcount_lock(struct lws_mutex_refcount *mr, const char *reason)
* *
* - it can be false and change to a different tid that is also false * - it can be false and change to a different tid that is also false
*/ */
if (mr->lock_owner == pthread_self()) { #ifdef __PTW32_H
/* If we use implementation of PThreads for Win that is
* distributed by VCPKG */
if (pthread_equal(mr->lock_owner, pthread_self()))
#else
if (mr->lock_owner == pthread_self())
#endif
{
/* atomic because we only change it if we own the lock */ /* atomic because we only change it if we own the lock */
mr->lock_depth++; mr->lock_depth++;
return; return;
@ -1294,7 +1307,13 @@ lws_mutex_refcount_unlock(struct lws_mutex_refcount *mr)
return; return;
mr->last_lock_reason = "free"; mr->last_lock_reason = "free";
#ifdef __PTW32_H
/* If we use implementation of PThreads for Win that is
* distributed by VCPKG */
memset(&mr->lock_owner, 0, sizeof(pthread_t));
#else
mr->lock_owner = 0; mr->lock_owner = 0;
#endif
// lwsl_notice("tid %d: unlock %s\n", mr->tid, mr->last_lock_reason); // lwsl_notice("tid %d: unlock %s\n", mr->tid, mr->last_lock_reason);
pthread_mutex_unlock(&mr->lock); pthread_mutex_unlock(&mr->lock);
} }
@ -1302,7 +1321,13 @@ lws_mutex_refcount_unlock(struct lws_mutex_refcount *mr)
void void
lws_mutex_refcount_assert_held(struct lws_mutex_refcount *mr) lws_mutex_refcount_assert_held(struct lws_mutex_refcount *mr)
{ {
#ifdef __PTW32_H
/* If we use implementation of PThreads for Win that is
* distributed by VCPKG */
assert(pthread_equal(mr->lock_owner, pthread_self()) && mr->lock_depth);
#else
assert(mr->lock_owner == pthread_self() && mr->lock_depth); assert(mr->lock_owner == pthread_self() && mr->lock_depth);
#endif
} }
#endif /* SMP */ #endif /* SMP */

View file

@ -421,11 +421,19 @@ if (GENCERTS)
message("OPENSSL_INPUT_WIN_PATH = ${OPENSSL_INPUT_WIN_PATH}") message("OPENSSL_INPUT_WIN_PATH = ${OPENSSL_INPUT_WIN_PATH}")
message("cmd = \"${OPENSSL_EXECUTABLE}\" req -new -newkey rsa:2048 -days 10000 -nodes -x509 -keyout \"${TEST_SERVER_SSL_KEY}\" -out \"${TEST_SERVER_SSL_CERT}\"") message("cmd = \"${OPENSSL_EXECUTABLE}\" req -new -newkey rsa:2048 -days 10000 -nodes -x509 -keyout \"${TEST_SERVER_SSL_KEY}\" -out \"${TEST_SERVER_SSL_CERT}\"")
if(OPENSSL_CONFIG_FILE)
execute_process(
COMMAND cmd /c type "${OPENSSL_INPUT_WIN_PATH}"
COMMAND "${OPENSSL_EXECUTABLE}" req -config ${OPENSSL_CONFIG_FILE} -new -newkey rsa:2048 -days 10000 -nodes -x509 -keyout "${TEST_SERVER_SSL_KEY}" -out "${TEST_SERVER_SSL_CERT}"
RESULT_VARIABLE OPENSSL_RETURN_CODE
OUTPUT_QUIET ERROR_QUIET)
else()
execute_process( execute_process(
COMMAND cmd /c type "${OPENSSL_INPUT_WIN_PATH}" COMMAND cmd /c type "${OPENSSL_INPUT_WIN_PATH}"
COMMAND "${OPENSSL_EXECUTABLE}" req -new -newkey rsa:2048 -days 10000 -nodes -x509 -keyout "${TEST_SERVER_SSL_KEY}" -out "${TEST_SERVER_SSL_CERT}" COMMAND "${OPENSSL_EXECUTABLE}" req -new -newkey rsa:2048 -days 10000 -nodes -x509 -keyout "${TEST_SERVER_SSL_KEY}" -out "${TEST_SERVER_SSL_CERT}"
RESULT_VARIABLE OPENSSL_RETURN_CODE RESULT_VARIABLE OPENSSL_RETURN_CODE
OUTPUT_QUIET ERROR_QUIET) OUTPUT_QUIET ERROR_QUIET)
endif()
message("\n") message("\n")
endif() endif()

View file

@ -110,7 +110,11 @@ lws_openssl_lock_callback(int mode, int type, const char *file, int line)
static unsigned long static unsigned long
lws_openssl_thread_id(void) lws_openssl_thread_id(void)
{ {
#ifdef __PTW32_H
return (unsigned long)(intptr_t)(pthread_self()).p;
#else
return (unsigned long)pthread_self(); return (unsigned long)pthread_self();
#endif
} }
#endif #endif