You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/08/01 17:29:15 UTC
[incubator-nuttx] 11/22: driver/sensor: using standard recursive mutex api
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 78eb832e23109387e3eb5c45e17f414cf0ec6987
Author: Jiuzhu Dong <do...@xiaomi.com>
AuthorDate: Tue Jun 14 11:33:13 2022 +0800
driver/sensor: using standard recursive mutex api
Signed-off-by: Jiuzhu Dong <do...@xiaomi.com>
---
drivers/sensors/sensor.c | 104 ++++++++++++++++-------------------------------
1 file changed, 35 insertions(+), 69 deletions(-)
diff --git a/drivers/sensors/sensor.c b/drivers/sensors/sensor.c
index ac487bb39f..41717cb9bb 100644
--- a/drivers/sensors/sensor.c
+++ b/drivers/sensors/sensor.c
@@ -37,6 +37,7 @@
#include <nuttx/list.h>
#include <nuttx/kmalloc.h>
#include <nuttx/mm/circbuf.h>
+#include <nuttx/mutex.h>
#include <nuttx/sensors/sensor.h>
/****************************************************************************
@@ -94,9 +95,7 @@ struct sensor_upperhalf_s
FAR struct sensor_lowerhalf_s *lower; /* The handle of lower half driver */
struct sensor_state_s state; /* The state of sensor device */
struct circbuf_s buffer; /* The circular buffer of sensor device */
- sem_t exclsem; /* Manages exclusive access to file operations */
- pid_t semholder; /* The current holder of the semaphore */
- int16_t semcount; /* Number of counts held */
+ rmutex_t lock; /* Manages exclusive access to file operations */
struct list_node userlist; /* List of users */
};
@@ -178,38 +177,6 @@ static const struct file_operations g_sensor_fops =
* Private Functions
****************************************************************************/
-static void sensor_semtake(FAR struct sensor_upperhalf_s *upper)
-{
- pid_t pid = gettid();
-
- if (pid == upper->semholder)
- {
- upper->semcount++;
- }
- else
- {
- nxsem_wait_uninterruptible(&upper->exclsem);
- upper->semholder = pid;
- upper->semcount = 1;
- }
-}
-
-static void sensor_semgive(FAR struct sensor_upperhalf_s *upper)
-{
- DEBUGASSERT(upper->semholder == gettid());
-
- if (upper->semcount > 1)
- {
- upper->semcount--;
- }
- else
- {
- upper->semholder = INVALID_PROCESS_ID;
- upper->semcount = 0;
- nxsem_post(&upper->exclsem);
- }
-}
-
static bool sensor_in_range(unsigned long left, unsigned long value,
unsigned long right)
{
@@ -392,7 +359,7 @@ static int sensor_open(FAR struct file *filep)
FAR struct sensor_user_s *user;
int ret = 0;
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
user = kmm_zalloc(sizeof(struct sensor_user_s));
if (user == NULL)
{
@@ -464,7 +431,7 @@ errout_with_open:
errout_with_user:
kmm_free(user);
errout_with_sem:
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
return ret;
}
@@ -476,13 +443,13 @@ static int sensor_close(FAR struct file *filep)
FAR struct sensor_user_s *user = filep->f_priv;
int ret = 0;
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
if (lower->ops->close)
{
ret = lower->ops->close(lower, filep);
if (ret < 0)
{
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
return ret;
}
}
@@ -509,7 +476,7 @@ static int sensor_close(FAR struct file *filep)
/* The user is closed, notify to other users */
sensor_pollnotify(upper, POLLPRI);
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
kmm_free(user);
return ret;
@@ -530,19 +497,19 @@ static ssize_t sensor_read(FAR struct file *filep, FAR char *buffer,
return -EINVAL;
}
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
if (lower->ops->fetch)
{
if (!(filep->f_oflags & O_NONBLOCK))
{
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
ret = nxsem_wait_uninterruptible(&user->buffersem);
if (ret < 0)
{
return ret;
}
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
}
else if (!upper->state.nsubscribers)
{
@@ -604,14 +571,14 @@ static ssize_t sensor_read(FAR struct file *filep, FAR char *buffer,
}
else
{
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
ret = nxsem_wait_uninterruptible(&user->buffersem);
if (ret < 0)
{
return ret;
}
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
}
}
}
@@ -641,7 +608,7 @@ static ssize_t sensor_read(FAR struct file *filep, FAR char *buffer,
}
out:
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
return ret;
}
@@ -669,27 +636,27 @@ static int sensor_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
{
case SNIOC_GET_STATE:
{
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
memcpy((FAR void *)(uintptr_t)arg,
&upper->state, sizeof(upper->state));
user->changed = false;
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
}
break;
case SNIOC_SET_INTERVAL:
{
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
ret = sensor_update_interval(filep, upper, user, arg);
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
}
break;
case SNIOC_BATCH:
{
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
ret = sensor_update_latency(filep, upper, user, arg);
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
}
break;
@@ -731,15 +698,15 @@ static int sensor_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
case SNIOC_SET_USERPRIV:
{
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
upper->state.priv = (FAR void *)(uintptr_t)arg;
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
}
break;
case SNIOC_SET_BUFFER_NUMBER:
{
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
if (!circbuf_is_init(&upper->buffer))
{
if (arg >= lower->nbuffer)
@@ -756,15 +723,15 @@ static int sensor_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
ret = -EBUSY;
}
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
}
break;
case SNIOC_READLAST:
{
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
user->readlast = !!arg;
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
}
break;
@@ -798,7 +765,7 @@ static int sensor_poll(FAR struct file *filep,
int semcount;
int ret = 0;
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
if (setup)
{
/* Don't have enough space to store fds */
@@ -850,7 +817,7 @@ static int sensor_poll(FAR struct file *filep,
}
errout:
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
return ret;
}
@@ -870,7 +837,7 @@ static ssize_t sensor_push_event(FAR void *priv, FAR const void *data,
return -EINVAL;
}
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
if (!circbuf_is_init(&upper->buffer))
{
/* Initialize sensor buffer when data is first generated */
@@ -879,7 +846,7 @@ static ssize_t sensor_push_event(FAR void *priv, FAR const void *data,
upper->state.esize);
if (ret < 0)
{
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
return ret;
}
}
@@ -900,7 +867,7 @@ static ssize_t sensor_push_event(FAR void *priv, FAR const void *data,
}
}
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
return bytes;
}
@@ -910,7 +877,7 @@ static void sensor_notify_event(FAR void *priv)
FAR struct sensor_user_s *user;
int semcount;
- sensor_semtake(upper);
+ nxrmutex_lock(&upper->lock);
list_for_every_entry(&upper->userlist, user, struct sensor_user_s, node)
{
nxsem_get_value(&user->buffersem, &semcount);
@@ -922,7 +889,7 @@ static void sensor_notify_event(FAR void *priv)
sensor_pollnotify_one(user, POLLIN);
}
- sensor_semgive(upper);
+ nxrmutex_unlock(&upper->lock);
}
/****************************************************************************
@@ -1026,8 +993,7 @@ int sensor_custom_register(FAR struct sensor_lowerhalf_s *lower,
upper->state.nadvertisers = 1;
}
- upper->semholder = INVALID_PROCESS_ID;
- nxsem_init(&upper->exclsem, 0, 1);
+ nxrmutex_init(&upper->lock);
/* Bind the lower half data structure member */
@@ -1069,7 +1035,7 @@ int sensor_custom_register(FAR struct sensor_lowerhalf_s *lower,
return ret;
drv_err:
- nxsem_destroy(&upper->exclsem);
+ nxrmutex_destroy(&upper->lock);
kmm_free(upper);
@@ -1132,7 +1098,7 @@ void sensor_custom_unregister(FAR struct sensor_lowerhalf_s *lower,
sensor_rpmsg_unregister(lower);
#endif
- nxsem_destroy(&upper->exclsem);
+ nxrmutex_destroy(&upper->lock);
if (circbuf_is_init(&upper->buffer))
{
circbuf_uninit(&upper->buffer);