mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 01:53:24 +09:00
55 lines
1.7 KiB
C++
55 lines
1.7 KiB
C++
// MobileGL - tools/trace_replay/trace_replay_lease_test.cpp
|
|
// Copyright (c) 2025-2026 MobileGL-Dev
|
|
// Licensed under the GNU Lesser General Public License v3.0:
|
|
// https://www.gnu.org/licenses/gpl-3.0.txt
|
|
// https://www.gnu.org/licenses/lgpl-3.0.txt
|
|
// SPDX-License-Identifier: LGPL-3.0-only
|
|
// End of Source File Header
|
|
|
|
#include "trace_replay_lease.hpp"
|
|
|
|
#include <iostream>
|
|
#include <thread>
|
|
#include <vector>
|
|
|
|
int main() {
|
|
using mobilegl_trace::TraceReplayLease;
|
|
std::atomic<int> rejected{0};
|
|
{
|
|
TraceReplayLease original;
|
|
if (!original) {
|
|
std::cerr << "initial replay could not claim process state\n";
|
|
return 1;
|
|
}
|
|
std::vector<std::thread> contenders;
|
|
for (int i = 0; i < 16; ++i) {
|
|
contenders.emplace_back([&] {
|
|
TraceReplayLease duplicate;
|
|
if (!duplicate) {
|
|
++rejected;
|
|
}
|
|
});
|
|
}
|
|
for (auto& thread : contenders) {
|
|
thread.join();
|
|
}
|
|
if (rejected != 16) {
|
|
std::cerr << "a duplicate replay entered the live process state\n";
|
|
return 1;
|
|
}
|
|
// A rejected caller's destructor must not release the real owner's claim.
|
|
TraceReplayLease stillDuplicate;
|
|
if (stillDuplicate) {
|
|
std::cerr << "rejected caller released the original replay's claim\n";
|
|
return 1;
|
|
}
|
|
}
|
|
TraceReplayLease next;
|
|
if (!next) {
|
|
std::cerr << "completed replay did not release process state\n";
|
|
return 1;
|
|
}
|
|
std::cout << "TraceReplayLease: concurrent invocations rejected; owner cleanup retained\n";
|
|
return 0;
|
|
}
|