@@ -59,6 +59,8 @@ struct uart_bth4_s
59
59
uint8_t sendbuf [CONFIG_UART_BTH4_TXBUFSIZE ];
60
60
size_t sendlen ;
61
61
mutex_t sendlock ;
62
+ mutex_t openlock ;
63
+ uint8_t refcnt ;
62
64
63
65
FAR struct pollfd * fds [CONFIG_UART_BTH4_NPOLLWAITERS ];
64
66
};
@@ -173,14 +175,35 @@ static int uart_bth4_open(FAR struct file *filep)
173
175
FAR struct inode * inode = filep -> f_inode ;
174
176
FAR struct uart_bth4_s * dev = inode -> i_private ;
175
177
int ret ;
178
+ uint8_t tmp ;
176
179
177
- ret = dev -> drv -> open ( dev -> drv );
180
+ ret = nxmutex_lock ( & dev -> openlock );
178
181
if (ret < 0 )
179
182
{
180
183
return ret ;
181
184
}
182
185
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 );
184
207
185
208
return OK ;
186
209
}
@@ -190,9 +213,19 @@ static int uart_bth4_close(FAR struct file *filep)
190
213
FAR struct inode * inode = filep -> f_inode ;
191
214
FAR struct uart_bth4_s * dev = inode -> i_private ;
192
215
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
+ }
194
223
224
+ dev -> refcnt = 0 ;
225
+ dev -> drv -> close (dev -> drv );
195
226
uart_bth4_pollnotify (dev , POLLIN | POLLOUT );
227
+ nxmutex_unlock (& dev -> openlock );
228
+
196
229
return OK ;
197
230
}
198
231
@@ -436,12 +469,14 @@ int uart_bth4_register(FAR const char *path, FAR struct bt_driver_s *drv)
436
469
drv -> priv = dev ;
437
470
438
471
nxmutex_init (& dev -> sendlock );
472
+ nxmutex_init (& dev -> openlock );
439
473
nxsem_init (& dev -> recvsem , 0 , 0 );
440
474
441
475
ret = register_driver (path , & g_uart_bth4_ops , 0666 , dev );
442
476
if (ret < 0 )
443
477
{
444
478
nxmutex_destroy (& dev -> sendlock );
479
+ nxmutex_destroy (& dev -> openlock );
445
480
nxsem_destroy (& dev -> recvsem );
446
481
circbuf_uninit (& dev -> circbuf );
447
482
kmm_free (dev );
0 commit comments