Fixed windows deadlocks, performance is shit tho
This commit is contained in:
@@ -107,13 +107,13 @@ void SweepstoreConcurrency::spawnTicket(SweepstoreFileHandle* _file,
|
||||
|
||||
SweepstoreWorkerTicketSnapshot snapshot = ticket.snapshot();
|
||||
|
||||
int identifier = snapshot.identifier;
|
||||
uint32_t identifier = snapshot.identifier;
|
||||
|
||||
bool identifier_unassigned = identifier == 0;
|
||||
bool stale_heartbeat = millisecondsSinceEpoch32() - snapshot.workerHeartbeat > STALE_HEARTBEAT_THRESHOLD_MS;
|
||||
bool is_free = snapshot.state == SweepstoreTicketState::FREE;
|
||||
|
||||
if (identifier_unassigned && stale_heartbeat && is_free) {
|
||||
if ((identifier_unassigned && is_free) || stale_heartbeat) {
|
||||
SWEEPSTORE_TIME_SCOPE("Claim Ticket");
|
||||
snapshot.identifier = newIdentifier;
|
||||
snapshot.workerHeartbeat = millisecondsSinceEpoch32();
|
||||
@@ -218,7 +218,7 @@ void SweepstoreConcurrency::initialiseMaster(std::string filePath) {
|
||||
SWEEPSTORE_TIME_FUNCTION();
|
||||
|
||||
auto log = [&](const std::string &message) {
|
||||
debugPrint("\033[38;5;33m[Concurrency Master]:\033[0m " + message);
|
||||
debugPrint(("\033[38;5;33m[Concurrency Master]:\033[0m " + message).c_str());
|
||||
};
|
||||
|
||||
SweepstoreFileHandle file(filePath, std::ios::binary | std::ios::in | std::ios::out);
|
||||
@@ -252,9 +252,27 @@ void SweepstoreConcurrency::initialiseMaster(std::string filePath) {
|
||||
ticket.write(cleanSnapshot);
|
||||
log("Reset ticket " + std::to_string(i) + ".");
|
||||
}
|
||||
}
|
||||
|
||||
// Handle stale tickets
|
||||
uint32_t currentTime = millisecondsSinceEpoch32();
|
||||
continue;
|
||||
|
||||
// Cleanup any stale tickets
|
||||
uint32_t currentTime = millisecondsSinceEpoch32();
|
||||
for (uint32_t i = 0; i < concurrentWorkers; i++) {
|
||||
SweepstoreWorkerTicket ticket(i, file);
|
||||
SweepstoreWorkerTicketSnapshot snapshot = ticket.snapshot();
|
||||
|
||||
if (snapshot.state != SweepstoreTicketState::FREE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
bool stale_heartbeat = currentTime - snapshot.workerHeartbeat > STALE_HEARTBEAT_THRESHOLD_MS;
|
||||
|
||||
if (stale_heartbeat) {
|
||||
SweepstoreWorkerTicketSnapshot cleanSnapshot = SweepstoreWorkerTicketSnapshot();
|
||||
ticket.write(cleanSnapshot);
|
||||
log("Stale heartbeat " + std::to_string(i) + ".");
|
||||
}
|
||||
}
|
||||
|
||||
preciseSleep(std::chrono::milliseconds(1));
|
||||
|
||||
@@ -84,6 +84,9 @@ private:
|
||||
if (it->second == Mode::Shared && mode == Mode::Exclusive) {
|
||||
releaseInternal(); // Release the old shared lock
|
||||
activeLocks.erase(it);
|
||||
// Small delay to allow OS to process the unlock before re-locking
|
||||
// This prevents deadlock when multiple threads upgrade simultaneously
|
||||
Sleep(1);
|
||||
} else {
|
||||
// Already hold compatible or same lock
|
||||
locked = true;
|
||||
|
||||
Reference in New Issue
Block a user