Fix pthread to number converstion ^KT-52429
Merge-request: KT-MR-6918 Merged-by: Alexander Shabalin <Alexander.Shabalin@jetbrains.com>
This commit is contained in:
committed by
Space
parent
45fc5fb76b
commit
58569f2eee
@@ -1,6 +1,7 @@
|
|||||||
#include "workerSignals.h"
|
#include "workerSignals.h"
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <cstring>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
@@ -21,7 +22,8 @@ extern "C" void setupSignalHandler(void) {
|
|||||||
|
|
||||||
extern "C" void signalThread(uint64_t thread, int value) {
|
extern "C" void signalThread(uint64_t thread, int value) {
|
||||||
pendingValue = value;
|
pendingValue = value;
|
||||||
auto t = reinterpret_cast<pthread_t>(thread);
|
pthread_t t = {};
|
||||||
|
memcpy(&t, &thread, sizeof(pthread_t));
|
||||||
auto result = pthread_kill(t, SIGUSR1);
|
auto result = pthread_kill(t, SIGUSR1);
|
||||||
assert(result == 0);
|
assert(result == 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -249,6 +249,14 @@ void waitInNativeState(pthread_cond_t* cond,
|
|||||||
CallWithThreadState<ThreadState::kNative>(WaitOnCondVar, cond, mutex, timeoutNanoseconds, microsecondsPassed);
|
CallWithThreadState<ThreadState::kNative>(WaitOnCondVar, cond, mutex, timeoutNanoseconds, microsecondsPassed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
KULong pthreadToNumber(pthread_t thread) {
|
||||||
|
static_assert(sizeof(pthread_t) <= sizeof(KULong), "Casting pthread_t to ULong will lose data");
|
||||||
|
// That's almost std::bit_cast. The latter requires sizeof equality of types.
|
||||||
|
KULong result = 0;
|
||||||
|
memcpy(&result, &thread, sizeof(pthread_t));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
class Locker {
|
class Locker {
|
||||||
public:
|
public:
|
||||||
explicit Locker(pthread_mutex_t* lock, bool switchThreadState = true) : lock_(lock), switchThreadState_(switchThreadState) {
|
explicit Locker(pthread_mutex_t* lock, bool switchThreadState = true) : lock_(lock), switchThreadState_(switchThreadState) {
|
||||||
@@ -639,9 +647,7 @@ class State {
|
|||||||
if (it == workers_.end()) {
|
if (it == workers_.end()) {
|
||||||
ThrowWorkerAlreadyTerminated();
|
ThrowWorkerAlreadyTerminated();
|
||||||
}
|
}
|
||||||
pthread_t thread = it->second->thread();
|
return pthreadToNumber(it->second->thread());
|
||||||
static_assert(sizeof(pthread_t) <= sizeof(KULong), "Casting pthread_t to ULong will lose data");
|
|
||||||
return reinterpret_cast<KULong>(thread);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OBJ_GETTER0(getActiveWorkers) {
|
OBJ_GETTER0(getActiveWorkers) {
|
||||||
|
|||||||
Reference in New Issue
Block a user