sdk-core v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Loading...
Searching...
No Matches
main.cpp
1#include <cstdio>
2#include <cstring>
3
4extern "C" {
5#include <kernel.h>
6}
7
8#include <chrono>
9#include <future>
10#include <numeric>
11#include <thread>
12#include <vector>
13
14extern "C" int kputs(char *s);
15
16/* A program must never return from main on the rig: that reboots the console. */
17static int rig_failed;
18static int rig_kputs(char *s) {
19 if (strstr(s, ": FAIL")) rig_failed = 1;
20 return kputs(s);
21}
22#define kputs rig_kputs
23
24static void accumulate(std::vector<int>::iterator first, std::vector<int>::iterator last,
25 std::promise<int> result) {
26 result.set_value(std::accumulate(first, last, 0));
27}
28
29static void signal_after_sleep(std::promise<void> barrier) {
30 std::this_thread::sleep_for(std::chrono::milliseconds(200));
31 barrier.set_value();
32}
33
34static int test_main() {
35 std::vector<int> numbers = {1, 2, 3, 4, 5, 6};
36 std::promise<int> sum_promise;
37 std::future<int> sum_future = sum_promise.get_future();
38 std::thread summer(accumulate, numbers.begin(), numbers.end(), std::move(sum_promise));
39 int sum = sum_future.get();
40 summer.join();
41
42 std::promise<void> barrier;
43 std::future<void> barrier_future = barrier.get_future();
44 std::thread sleeper(signal_after_sleep, std::move(barrier));
45 barrier_future.wait();
46 sleeper.join();
47
48 if (sum != 21) {
49 kputs((char *)"cxx-threads: FAIL wrong sum\n");
50 return 1;
51 }
52
53 kputs((char *)"cxx-threads: PASS\n");
54 return 0;
55}
56
57int main() {
58 int result = test_main();
59 printf("[ps2rig] exit=%d\n", (result || rig_failed) ? 1 : 0);
60 SleepThread();
61 return 0;
62}