driver/sensor: fix crash casued by closing the handle during the reading.

N/A

Change-Id: I0632f3f81192b3924302f9b363497822b1117032
Signed-off-by: Jiuzhu Dong <dongjiuzhu1@xiaomi.com>
This commit is contained in:
Jiuzhu Dong
2021-06-23 14:05:14 +08:00
committed by dongjiuzhu1
parent d37d8e00a5
commit 6d883bbb5d
+31 -25
View File
@@ -49,7 +49,8 @@ struct fakesensor_s
unsigned int batch;
int raw_start;
FAR const char *file_path;
sem_t run;
sem_t wakeup;
bool running;
};
/****************************************************************************
@@ -128,31 +129,17 @@ static int fakesensor_activate(FAR struct sensor_lowerhalf_s *lower, bool sw)
{
FAR struct fakesensor_s *sensor = container_of(lower,
struct fakesensor_s, lower);
int ret;
if (sw)
{
ret = file_open(&sensor->data, sensor->file_path, O_RDONLY);
if (ret < 0)
{
snerr("Failed to open file:%s, err:%d", sensor->file_path, ret);
return ret;
}
fakesensor_read_csv_header(sensor);
sensor->running = true;
/* Wake up the thread */
nxsem_post(&sensor->run);
nxsem_post(&sensor->wakeup);
}
else
{
ret = file_close(&sensor->data);
if (ret < 0)
{
snerr("Failed to close file:%s, err:%d", sensor->file_path, ret);
return ret;
}
sensor->running = false;
}
return OK;
@@ -236,10 +223,26 @@ static int fakesensor_thread(int argc, char** argv)
{
FAR struct fakesensor_s *sensor = (FAR struct fakesensor_s *)
((uintptr_t)strtoul(argv[1], NULL, 0));
int ret;
while (true)
{
if (sensor->data.f_inode != NULL)
/* Waiting to be woken up */
nxsem_wait_uninterruptible(&sensor->wakeup);
/* Open csv file and init file handle */
ret = file_open(&sensor->data, sensor->file_path, O_RDONLY);
if (ret < 0)
{
snerr("Failed to open file:%s, err:%d", sensor->file_path, ret);
return ret;
}
fakesensor_read_csv_header(sensor);
while (sensor->running)
{
/* Sleeping thread for interval */
@@ -261,11 +264,14 @@ static int fakesensor_thread(int argc, char** argv)
fakesensor_push_event(&sensor->lower);
}
}
else
{
/* Waiting to be woken up */
nxsem_wait(&sensor->run);
/* Close csv file handle when running change true to false */
ret = file_close(&sensor->data);
if (ret < 0)
{
snerr("Failed to close file:%s, err:%d", sensor->file_path, ret);
return ret;
}
}
}
@@ -320,8 +326,8 @@ int fakesensor_init(int type, FAR const char *file_name,
sensor->interval = 100000;
sensor->file_path = file_name;
nxsem_init(&sensor->run, 0, 0);
nxsem_set_protocol(&sensor->run, SEM_PRIO_NONE);
nxsem_init(&sensor->wakeup, 0, 0);
nxsem_set_protocol(&sensor->wakeup, SEM_PRIO_NONE);
/* Create thread for sensor */