boardd: wait for safety_setter_thread to finish while quitting panda_state_thread (#21961)

* rebase master

* merge master

* merge master

* remove space
pull/22426/head
Dean Lee 2021-10-04 20:38:35 +08:00 committed by GitHub
parent 009e37e797
commit 47f601e50a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 10 additions and 13 deletions

View File

@ -9,9 +9,11 @@
#include <bitset>
#include <cassert>
#include <cerrno>
#include <chrono>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <future>
#include <thread>
#include <unordered_map>
@ -34,20 +36,19 @@
#define CUTOFF_IL 200
#define SATURATE_IL 1600
#define NIBBLE_TO_HEX(n) ((n) < 10 ? (n) + '0' : ((n) - 10) + 'a')
using namespace std::chrono_literals;
std::atomic<bool> safety_setter_thread_running(false);
std::atomic<bool> ignition(false);
ExitHandler do_exit;
std::string get_time_str(const struct tm &time) {
char s[30] = {'\0'};
std::strftime(s, std::size(s), "%Y-%m-%d %H:%M:%S", &time);
return s;
}
void safety_setter_thread(Panda *panda) {
bool safety_setter_thread(Panda *panda) {
LOGD("Starting safety setter thread");
// diagnostic only is the default, needed for VIN query
panda->set_safety_model(cereal::CarParams::SafetyModel::ELM327);
@ -57,8 +58,7 @@ void safety_setter_thread(Panda *panda) {
// switch to SILENT when CarVin param is read
while (true) {
if (do_exit || !panda->connected) {
safety_setter_thread_running = false;
return;
return false;
};
std::string value_vin = p.get("CarVin");
@ -78,8 +78,7 @@ void safety_setter_thread(Panda *panda) {
LOGW("waiting for params to set safety model");
while (true) {
if (do_exit || !panda->connected) {
safety_setter_thread_running = false;
return;
return false;
};
if (p.getBool("ControlsReady")) {
@ -101,8 +100,7 @@ void safety_setter_thread(Panda *panda) {
LOGW("setting safety model: %d with param %d", (int)safety_model, safety_param);
panda->set_safety_model(safety_model, safety_param);
safety_setter_thread_running = false;
return true;
}
@ -349,6 +347,7 @@ void send_peripheral_state(PubMaster *pm, Panda *panda) {
void panda_state_thread(PubMaster *pm, Panda * peripheral_panda, Panda *panda, bool spoofing_started) {
Params params;
bool ignition_last = false;
std::future<bool> safety_future;
LOGD("start panda state thread");
@ -360,10 +359,8 @@ void panda_state_thread(PubMaster *pm, Panda * peripheral_panda, Panda *panda, b
// clear VIN, CarParams, and set new safety on car start
if (ignition && !ignition_last) {
params.clearAll(CLEAR_ON_IGNITION_ON);
if (!safety_setter_thread_running) {
safety_setter_thread_running = true;
std::thread(safety_setter_thread, panda).detach();
if (!safety_future.valid() || safety_future.wait_for(0ms) == std::future_status::ready) {
safety_future = std::async(std::launch::async, safety_setter_thread, panda);
} else {
LOGW("Safety setter thread already running");
}