blob: a43a1083240adfb367692524a566e6ce9d26d37d [file] [log] [blame]
Austin Schuh812d0d12021-11-04 20:16:48 -07001// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
Brian Silverman8fce7482020-01-05 13:18:21 -08004
5#include "hal/Main.h"
6
7#include <wpi/condition_variable.h>
8#include <wpi/mutex.h>
9
10static void DefaultMain(void*);
11static void DefaultExit(void*);
12
13static bool gHasMain = false;
14static void* gMainParam = nullptr;
15static void (*gMainFunc)(void*) = DefaultMain;
16static void (*gExitFunc)(void*) = DefaultExit;
17static bool gExited = false;
18struct MainObj {
19 wpi::mutex gExitMutex;
20 wpi::condition_variable gExitCv;
21};
22
23static MainObj* mainObj;
24
25static void DefaultMain(void*) {
26 std::unique_lock lock{mainObj->gExitMutex};
27 mainObj->gExitCv.wait(lock, [] { return gExited; });
28}
29
30static void DefaultExit(void*) {
31 std::lock_guard lock{mainObj->gExitMutex};
32 gExited = true;
33 mainObj->gExitCv.notify_all();
34}
35
Austin Schuh812d0d12021-11-04 20:16:48 -070036namespace hal::init {
Brian Silverman8fce7482020-01-05 13:18:21 -080037void InitializeMain() {
38 static MainObj mO;
39 mainObj = &mO;
40}
Austin Schuh812d0d12021-11-04 20:16:48 -070041} // namespace hal::init
Brian Silverman8fce7482020-01-05 13:18:21 -080042
43extern "C" {
44
45void HAL_SetMain(void* param, void (*mainFunc)(void*),
46 void (*exitFunc)(void*)) {
47 gHasMain = true;
48 gMainParam = param;
49 gMainFunc = mainFunc;
50 gExitFunc = exitFunc;
51}
52
Austin Schuh812d0d12021-11-04 20:16:48 -070053HAL_Bool HAL_HasMain(void) {
54 return gHasMain;
55}
Brian Silverman8fce7482020-01-05 13:18:21 -080056
Austin Schuh812d0d12021-11-04 20:16:48 -070057void HAL_RunMain(void) {
58 gMainFunc(gMainParam);
59}
Brian Silverman8fce7482020-01-05 13:18:21 -080060
Austin Schuh812d0d12021-11-04 20:16:48 -070061void HAL_ExitMain(void) {
62 gExitFunc(gMainParam);
63}
Brian Silverman8fce7482020-01-05 13:18:21 -080064
65} // extern "C"