Merge pull request #121 from grissiom/device-ref-count
device: add ref_count support
This commit is contained in:
commit
198a6a162a
|
@ -779,6 +779,7 @@ struct rt_device
|
||||||
rt_uint16_t flag; /**< device flag */
|
rt_uint16_t flag; /**< device flag */
|
||||||
rt_uint16_t open_flag; /**< device open flag */
|
rt_uint16_t open_flag; /**< device open flag */
|
||||||
|
|
||||||
|
rt_uint8_t ref_count; /**< reference count */
|
||||||
rt_uint8_t device_id; /**< 0 - 255 */
|
rt_uint8_t device_id; /**< 0 - 255 */
|
||||||
|
|
||||||
/* device call back */
|
/* device call back */
|
||||||
|
|
29
src/device.c
29
src/device.c
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* File : device.c
|
* File : device.c
|
||||||
* This file is part of RT-Thread RTOS
|
* This file is part of RT-Thread RTOS
|
||||||
* COPYRIGHT (C) 2006 - 2012, RT-Thread Development Team
|
* COPYRIGHT (C) 2006 - 2013, RT-Thread Development Team
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -24,6 +24,7 @@
|
||||||
* 2012-10-20 Bernard add device check in register function,
|
* 2012-10-20 Bernard add device check in register function,
|
||||||
* provided by Rob <rdent@iinet.net.au>
|
* provided by Rob <rdent@iinet.net.au>
|
||||||
* 2012-12-25 Bernard return RT_EOK if the device interface not exist.
|
* 2012-12-25 Bernard return RT_EOK if the device interface not exist.
|
||||||
|
* 2013-07-09 Grissiom add ref_count support
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
|
@ -51,6 +52,7 @@ rt_err_t rt_device_register(rt_device_t dev,
|
||||||
|
|
||||||
rt_object_init(&(dev->parent), RT_Object_Class_Device, name);
|
rt_object_init(&(dev->parent), RT_Object_Class_Device, name);
|
||||||
dev->flag = flags;
|
dev->flag = flags;
|
||||||
|
dev->ref_count = 0;
|
||||||
|
|
||||||
return RT_EOK;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
|
@ -237,6 +239,11 @@ rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag)
|
||||||
return -RT_EBUSY;
|
return -RT_EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev->ref_count++;
|
||||||
|
/* don't let bad things happen silently. If you are bitten by this assert,
|
||||||
|
* please set the ref_count to a bigger type. */
|
||||||
|
RT_ASSERT(dev->ref_count != 0);
|
||||||
|
|
||||||
/* call device open interface */
|
/* call device open interface */
|
||||||
if (dev->open != RT_NULL)
|
if (dev->open != RT_NULL)
|
||||||
{
|
{
|
||||||
|
@ -264,6 +271,14 @@ rt_err_t rt_device_close(rt_device_t dev)
|
||||||
|
|
||||||
RT_ASSERT(dev != RT_NULL);
|
RT_ASSERT(dev != RT_NULL);
|
||||||
|
|
||||||
|
if (dev->ref_count == 0)
|
||||||
|
return -RT_ERROR;
|
||||||
|
|
||||||
|
dev->ref_count--;
|
||||||
|
|
||||||
|
if (dev->ref_count != 0)
|
||||||
|
return RT_EOK;
|
||||||
|
|
||||||
/* call device close interface */
|
/* call device close interface */
|
||||||
if (dev->close != RT_NULL)
|
if (dev->close != RT_NULL)
|
||||||
{
|
{
|
||||||
|
@ -297,6 +312,12 @@ rt_size_t rt_device_read(rt_device_t dev,
|
||||||
{
|
{
|
||||||
RT_ASSERT(dev != RT_NULL);
|
RT_ASSERT(dev != RT_NULL);
|
||||||
|
|
||||||
|
if (dev->ref_count == 0)
|
||||||
|
{
|
||||||
|
rt_set_errno(-RT_ERROR);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* call device read interface */
|
/* call device read interface */
|
||||||
if (dev->read != RT_NULL)
|
if (dev->read != RT_NULL)
|
||||||
{
|
{
|
||||||
|
@ -329,6 +350,12 @@ rt_size_t rt_device_write(rt_device_t dev,
|
||||||
{
|
{
|
||||||
RT_ASSERT(dev != RT_NULL);
|
RT_ASSERT(dev != RT_NULL);
|
||||||
|
|
||||||
|
if (dev->ref_count == 0)
|
||||||
|
{
|
||||||
|
rt_set_errno(-RT_ERROR);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* call device write interface */
|
/* call device write interface */
|
||||||
if (dev->write != RT_NULL)
|
if (dev->write != RT_NULL)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue