retry ioctls while errno == EINTR (#22054)
parent
37dda3d6bf
commit
31230e5b60
|
@ -32,7 +32,7 @@ const uint16_t INFINITY_DAC = 364;
|
|||
extern ExitHandler do_exit;
|
||||
|
||||
static int cam_ioctl(int fd, unsigned long int request, void *arg, const char *log_msg = nullptr) {
|
||||
int err = ioctl(fd, request, arg);
|
||||
int err = HANDLE_EINTR(ioctl(fd, request, arg));
|
||||
if (err != 0 && log_msg) {
|
||||
LOG(util::string_format("%s: %d", log_msg, err).c_str());
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ static void camera_release_buffer(void* cookie, int buf_idx) {
|
|||
CameraState *s = (CameraState *)cookie;
|
||||
// printf("camera_release_buffer %d\n", buf_idx);
|
||||
s->ss[0].qbuf_info[buf_idx].dirty_buf = 1;
|
||||
ioctl(s->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &s->ss[0].qbuf_info[buf_idx]);
|
||||
HANDLE_EINTR(ioctl(s->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &s->ss[0].qbuf_info[buf_idx]));
|
||||
}
|
||||
|
||||
int sensor_write_regs(CameraState *s, struct msm_camera_i2c_reg_array* arr, size_t size, msm_camera_i2c_data_type data_type) {
|
||||
|
@ -94,7 +94,7 @@ int sensor_write_regs(CameraState *s, struct msm_camera_i2c_reg_array* arr, size
|
|||
.delay = 0,
|
||||
};
|
||||
sensorb_cfg_data cfg_data = {.cfgtype = CFG_WRITE_I2C_ARRAY, .cfg.setting = &out_settings};
|
||||
return ioctl(s->sensor_fd, VIDIOC_MSM_SENSOR_CFG, &cfg_data);
|
||||
return HANDLE_EINTR(ioctl(s->sensor_fd, VIDIOC_MSM_SENSOR_CFG, &cfg_data));
|
||||
}
|
||||
|
||||
static int imx298_apply_exposure(CameraState *s, int gain, int integ_lines, uint32_t frame_length) {
|
||||
|
@ -797,7 +797,7 @@ void actuator_move(CameraState *s, uint16_t target) {
|
|||
.curr_lens_pos = s->cur_lens_pos,
|
||||
.ringing_params = &actuator_ringing_params,
|
||||
};
|
||||
ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data);
|
||||
HANDLE_EINTR(ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data));
|
||||
|
||||
s->cur_step_pos = dest_step_pos;
|
||||
s->cur_lens_pos = actuator_cfg_data.cfg.move.curr_lens_pos;
|
||||
|
@ -962,7 +962,7 @@ void cameras_open(MultiCameraState *s) {
|
|||
|
||||
// ISPIF: set vfe info
|
||||
struct ispif_cfg_data ispif_cfg_data = {.cfg_type = ISPIF_SET_VFE_INFO, .vfe_info.num_vfe = 2};
|
||||
int err = ioctl(s->ispif_fd, VIDIOC_MSM_ISPIF_CFG, &ispif_cfg_data);
|
||||
int err = HANDLE_EINTR(ioctl(s->ispif_fd, VIDIOC_MSM_ISPIF_CFG, &ispif_cfg_data));
|
||||
LOG("ispif set vfe info: %d", err);
|
||||
|
||||
// ISPIF: setup
|
||||
|
@ -1142,7 +1142,7 @@ void cameras_run(MultiCameraState *s) {
|
|||
CameraState *c = cameras[i];
|
||||
|
||||
struct v4l2_event ev = {};
|
||||
ret = ioctl(c->isp_fd, VIDIOC_DQEVENT, &ev);
|
||||
ret = HANDLE_EINTR(ioctl(c->isp_fd, VIDIOC_DQEVENT, &ev));
|
||||
const msm_isp_event_data *isp_event_data = (const msm_isp_event_data *)ev.u.data;
|
||||
|
||||
if (ev.type == ISP_EVENT_BUF_DIVERT) {
|
||||
|
@ -1157,7 +1157,7 @@ void cameras_run(MultiCameraState *s) {
|
|||
parse_autofocus(c, (uint8_t *)(ss.bufs[buf_idx].addr));
|
||||
}
|
||||
ss.qbuf_info[buf_idx].dirty_buf = 1;
|
||||
ioctl(c->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &ss.qbuf_info[buf_idx]);
|
||||
HANDLE_EINTR(ioctl(c->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &ss.qbuf_info[buf_idx]));
|
||||
}
|
||||
|
||||
} else if (ev.type == ISP_EVENT_EOF) {
|
||||
|
|
|
@ -68,7 +68,7 @@ int cam_control(int fd, int op_code, void *handle, int size) {
|
|||
camcontrol.handle_type = CAM_HANDLE_USER_POINTER;
|
||||
}
|
||||
|
||||
int ret = ioctl(fd, VIDIOC_CAM_CONTROL, &camcontrol);
|
||||
int ret = HANDLE_EINTR(ioctl(fd, VIDIOC_CAM_CONTROL, &camcontrol));
|
||||
if (ret == -1) {
|
||||
printf("OP CODE ERR - %d \n", op_code);
|
||||
perror("wat");
|
||||
|
@ -818,7 +818,7 @@ void cameras_open(MultiCameraState *s) {
|
|||
static struct v4l2_event_subscription sub = {0};
|
||||
sub.type = V4L_EVENT_CAM_REQ_MGR_EVENT;
|
||||
sub.id = 2; // should use boot time for sof
|
||||
ret = ioctl(s->video0_fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
|
||||
ret = HANDLE_EINTR(ioctl(s->video0_fd, VIDIOC_SUBSCRIBE_EVENT, &sub));
|
||||
printf("req mgr subscribe: %d\n", ret);
|
||||
|
||||
camera_open(&s->road_cam);
|
||||
|
@ -1102,22 +1102,26 @@ void cameras_run(MultiCameraState *s) {
|
|||
if (!fds[0].revents) continue;
|
||||
|
||||
struct v4l2_event ev = {0};
|
||||
ret = ioctl(fds[0].fd, VIDIOC_DQEVENT, &ev);
|
||||
if (ev.type == V4L_EVENT_CAM_REQ_MGR_EVENT) {
|
||||
struct cam_req_mgr_message *event_data = (struct cam_req_mgr_message *)ev.u.data;
|
||||
// LOGD("v4l2 event: sess_hdl %d, link_hdl %d, frame_id %d, req_id %lld, timestamp 0x%llx, sof_status %d\n", event_data->session_hdl, event_data->u.frame_msg.link_hdl, event_data->u.frame_msg.frame_id, event_data->u.frame_msg.request_id, event_data->u.frame_msg.timestamp, event_data->u.frame_msg.sof_status);
|
||||
// printf("sess_hdl %d, link_hdl %d, frame_id %lu, req_id %lu, timestamp 0x%lx, sof_status %d\n", event_data->session_hdl, event_data->u.frame_msg.link_hdl, event_data->u.frame_msg.frame_id, event_data->u.frame_msg.request_id, event_data->u.frame_msg.timestamp, event_data->u.frame_msg.sof_status);
|
||||
ret = HANDLE_EINTR(ioctl(fds[0].fd, VIDIOC_DQEVENT, &ev));
|
||||
if (ret == 0) {
|
||||
if (ev.type == V4L_EVENT_CAM_REQ_MGR_EVENT) {
|
||||
struct cam_req_mgr_message *event_data = (struct cam_req_mgr_message *)ev.u.data;
|
||||
// LOGD("v4l2 event: sess_hdl %d, link_hdl %d, frame_id %d, req_id %lld, timestamp 0x%llx, sof_status %d\n", event_data->session_hdl, event_data->u.frame_msg.link_hdl, event_data->u.frame_msg.frame_id, event_data->u.frame_msg.request_id, event_data->u.frame_msg.timestamp, event_data->u.frame_msg.sof_status);
|
||||
// printf("sess_hdl %d, link_hdl %d, frame_id %lu, req_id %lu, timestamp 0x%lx, sof_status %d\n", event_data->session_hdl, event_data->u.frame_msg.link_hdl, event_data->u.frame_msg.frame_id, event_data->u.frame_msg.request_id, event_data->u.frame_msg.timestamp, event_data->u.frame_msg.sof_status);
|
||||
|
||||
if (event_data->session_hdl == s->road_cam.session_handle) {
|
||||
handle_camera_event(&s->road_cam, event_data);
|
||||
} else if (event_data->session_hdl == s->wide_road_cam.session_handle) {
|
||||
handle_camera_event(&s->wide_road_cam, event_data);
|
||||
} else if (event_data->session_hdl == s->driver_cam.session_handle) {
|
||||
handle_camera_event(&s->driver_cam, event_data);
|
||||
} else {
|
||||
printf("Unknown vidioc event source\n");
|
||||
assert(false);
|
||||
if (event_data->session_hdl == s->road_cam.session_handle) {
|
||||
handle_camera_event(&s->road_cam, event_data);
|
||||
} else if (event_data->session_hdl == s->wide_road_cam.session_handle) {
|
||||
handle_camera_event(&s->wide_road_cam, event_data);
|
||||
} else if (event_data->session_hdl == s->driver_cam.session_handle) {
|
||||
handle_camera_event(&s->driver_cam, event_data);
|
||||
} else {
|
||||
printf("Unknown vidioc event source\n");
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
LOGE("VIDIOC_DQEVENT failed, errno=%d", errno);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <stdexcept>
|
||||
|
||||
#include "selfdrive/common/swaglog.h"
|
||||
#include "selfdrive/common/util.h"
|
||||
|
||||
#define UNUSED(x) (void)(x)
|
||||
|
||||
|
@ -36,7 +37,7 @@ I2CBus::~I2CBus() {
|
|||
int I2CBus::read_register(uint8_t device_address, uint register_address, uint8_t *buffer, uint8_t len) {
|
||||
int ret = 0;
|
||||
|
||||
ret = ioctl(i2c_fd, I2C_SLAVE, device_address);
|
||||
ret = HANDLE_EINTR(ioctl(i2c_fd, I2C_SLAVE, device_address));
|
||||
if(ret < 0) { goto fail; }
|
||||
|
||||
ret = i2c_smbus_read_i2c_block_data(i2c_fd, register_address, len, buffer);
|
||||
|
@ -49,7 +50,7 @@ fail:
|
|||
int I2CBus::set_register(uint8_t device_address, uint register_address, uint8_t data) {
|
||||
int ret = 0;
|
||||
|
||||
ret = ioctl(i2c_fd, I2C_SLAVE, device_address);
|
||||
ret = HANDLE_EINTR(ioctl(i2c_fd, I2C_SLAVE, device_address));
|
||||
if(ret < 0) { goto fail; }
|
||||
|
||||
ret = i2c_smbus_write_byte_data(i2c_fd, register_address, data);
|
||||
|
|
|
@ -20,17 +20,6 @@
|
|||
#include "selfdrive/common/util.h"
|
||||
#include "selfdrive/hardware/hw.h"
|
||||
|
||||
// keep trying if x gets interrupted by a signal
|
||||
#define HANDLE_EINTR(x) \
|
||||
({ \
|
||||
decltype(x) ret; \
|
||||
int try_cnt = 0; \
|
||||
do { \
|
||||
ret = (x); \
|
||||
} while (ret == -1 && errno == EINTR && try_cnt++ < 100); \
|
||||
ret; \
|
||||
})
|
||||
|
||||
namespace {
|
||||
|
||||
volatile sig_atomic_t params_do_exit = 0;
|
||||
|
|
|
@ -13,6 +13,17 @@
|
|||
#include <string>
|
||||
#include <thread>
|
||||
|
||||
// keep trying if x gets interrupted by a signal
|
||||
#define HANDLE_EINTR(x) \
|
||||
({ \
|
||||
decltype(x) ret; \
|
||||
int try_cnt = 0; \
|
||||
do { \
|
||||
ret = (x); \
|
||||
} while (ret == -1 && errno == EINTR && try_cnt++ < 100); \
|
||||
ret; \
|
||||
})
|
||||
|
||||
#ifndef sighandler_t
|
||||
typedef void (*sighandler_t)(int sig);
|
||||
#endif
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
#include "selfdrive/common/clutil.h"
|
||||
#include "selfdrive/common/timing.h"
|
||||
#include "selfdrive/common/util.h"
|
||||
|
||||
//#define RUN_DISASSEMBLER
|
||||
//#define RUN_OPTIMIZER
|
||||
|
@ -112,7 +113,7 @@ int ioctl(int filedes, unsigned long request, void *argp) {
|
|||
}
|
||||
}
|
||||
|
||||
int ret = my_ioctl(filedes, request, argp);
|
||||
int ret = HANDLE_EINTR(my_ioctl(filedes, request, argp));
|
||||
if (ret != 0) printf("ioctl returned %d with errno %d\n", ret, errno);
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue