Skip to content

Commit 7a97eef

Browse files
fangzhenweixiaoxiang781216
authored andcommitted
serial: use dev references count make sure the driver only opened once
Signed-off-by: fangzhenwei <[email protected]>
1 parent dfbeba3 commit 7a97eef

File tree

1 file changed

+38
-3
lines changed

1 file changed

+38
-3
lines changed

drivers/serial/uart_bth4.c

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ struct uart_bth4_s
5959
uint8_t sendbuf[CONFIG_UART_BTH4_TXBUFSIZE];
6060
size_t sendlen;
6161
mutex_t sendlock;
62+
mutex_t openlock;
63+
uint8_t refcnt;
6264

6365
FAR struct pollfd *fds[CONFIG_UART_BTH4_NPOLLWAITERS];
6466
};
@@ -173,14 +175,35 @@ static int uart_bth4_open(FAR struct file *filep)
173175
FAR struct inode *inode = filep->f_inode;
174176
FAR struct uart_bth4_s *dev = inode->i_private;
175177
int ret;
178+
uint8_t tmp;
176179

177-
ret = dev->drv->open(dev->drv);
180+
ret = nxmutex_lock(&dev->openlock);
178181
if (ret < 0)
179182
{
180183
return ret;
181184
}
182185

183-
dev->sendlen = 0;
186+
tmp = dev->refcnt + 1;
187+
if (tmp == 0)
188+
{
189+
nxmutex_unlock(&dev->openlock);
190+
return -EMFILE;
191+
}
192+
193+
if (tmp == 1)
194+
{
195+
ret = dev->drv->open(dev->drv);
196+
if (ret < 0)
197+
{
198+
nxmutex_unlock(&dev->openlock);
199+
return ret;
200+
}
201+
202+
dev->sendlen = 0;
203+
}
204+
205+
dev->refcnt = tmp;
206+
nxmutex_unlock(&dev->openlock);
184207

185208
return OK;
186209
}
@@ -190,9 +213,19 @@ static int uart_bth4_close(FAR struct file *filep)
190213
FAR struct inode *inode = filep->f_inode;
191214
FAR struct uart_bth4_s *dev = inode->i_private;
192215

193-
dev->drv->close(dev->drv);
216+
nxmutex_lock(&dev->openlock);
217+
if (dev->refcnt > 1)
218+
{
219+
dev->refcnt--;
220+
nxmutex_unlock(&dev->openlock);
221+
return OK;
222+
}
194223

224+
dev->refcnt = 0;
225+
dev->drv->close(dev->drv);
195226
uart_bth4_pollnotify(dev, POLLIN | POLLOUT);
227+
nxmutex_unlock(&dev->openlock);
228+
196229
return OK;
197230
}
198231

@@ -436,12 +469,14 @@ int uart_bth4_register(FAR const char *path, FAR struct bt_driver_s *drv)
436469
drv->priv = dev;
437470

438471
nxmutex_init(&dev->sendlock);
472+
nxmutex_init(&dev->openlock);
439473
nxsem_init(&dev->recvsem, 0, 0);
440474

441475
ret = register_driver(path, &g_uart_bth4_ops, 0666, dev);
442476
if (ret < 0)
443477
{
444478
nxmutex_destroy(&dev->sendlock);
479+
nxmutex_destroy(&dev->openlock);
445480
nxsem_destroy(&dev->recvsem);
446481
circbuf_uninit(&dev->circbuf);
447482
kmm_free(dev);

0 commit comments

Comments
 (0)