FIX: It is not safe to call cameras_close before all threads are done. (#19555)

* call cameras_close after all threads exited

* stop buffer before join

* remove buf->stop
albatross
Dean Lee 2021-01-12 22:27:20 +08:00 committed by GitHub
parent a1c7f19fe4
commit 660abb79dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 10 additions and 11 deletions

View File

@ -25,7 +25,7 @@ void camera_open(CameraState *s, bool rear) {
}
void camera_close(CameraState *s) {
s->buf.stop();
// empty
}
void camera_init(VisionIpcServer * v, CameraState *s, int camera_id, unsigned int fps, cl_device_id device_id, cl_context ctx, VisionStreamType rgb_type, VisionStreamType yuv_type) {
@ -117,6 +117,6 @@ void cameras_run(MultiCameraState *s) {
std::thread t = start_process_thread(s, "processing", &s->rear, camera_process_rear);
set_thread_name("frame_streaming");
run_frame_stream(s);
cameras_close(s);
t.join();
cameras_close(s);
}

View File

@ -1491,8 +1491,6 @@ void cameras_open(MultiCameraState *s) {
static void camera_close(CameraState *s) {
s->buf.stop();
// ISP: STOP_STREAM
s->stream_cfg.cmd = STOP_STREAM;
int err = ioctl(s->isp_fd, VIDIOC_MSM_ISP_CFG_STREAM, &s->stream_cfg);
@ -1783,9 +1781,9 @@ void cameras_run(MultiCameraState *s) {
err = pthread_join(ops_thread_handle, NULL);
assert(err == 0);
cameras_close(s);
for (auto &t : threads) t.join();
cameras_close(s);
}
void cameras_close(MultiCameraState *s) {

View File

@ -903,7 +903,6 @@ static void camera_close(CameraState *s) {
ret = cam_control(s->video0_fd, CAM_REQ_MGR_DESTROY_SESSION, &s->req_mgr_session_info, sizeof(s->req_mgr_session_info));
LOGD("destroyed session: %d", ret);
s->buf.stop();
}
static void cameras_close(MultiCameraState *s) {
@ -1197,7 +1196,7 @@ void cameras_run(MultiCameraState *s) {
err = pthread_join(ae_thread_handle, NULL);
assert(err == 0);
cameras_close(s);
for (auto &t : threads) t.join();
cameras_close(s);
}

View File

@ -31,7 +31,7 @@ void camera_open(CameraState *s, bool rear) {
}
void camera_close(CameraState *s) {
s->buf.stop();
// empty
}
void camera_init(VisionIpcServer * v, CameraState *s, int camera_id, unsigned int fps, cl_device_id device_id, cl_context ctx, VisionStreamType rgb_type, VisionStreamType yuv_type) {
@ -271,8 +271,10 @@ void cameras_run(MultiCameraState *s) {
std::thread t_rear = std::thread(rear_thread, &s->rear);
set_thread_name("webcam_thread");
front_thread(&s->front);
t_rear.join();
cameras_close(s);
for (auto &t : threads) t.join();
cameras_close(s);
}