1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-16 10:20:30 +00:00

- Improve comments about locking of the "struct fifoinfo" which is a bit

unclear.
- Fix a memory leak [0]

[0] Diagnosed by:	Dorr H. Clark <dclark at engr dot scu dot edu>
MFC:	1 week
This commit is contained in:
Attilio Rao 2009-11-06 22:29:46 +00:00
parent b66e2b8e50
commit 9c76640868
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=199007

View File

@ -78,6 +78,10 @@ struct fileops fifo_ops_f = {
/*
* This structure is associated with the FIFO vnode and stores
* the state associated with the FIFO.
* Notes about locking:
* - fi_readsock and fi_writesock are invariant since init time.
* - fi_readers and fi_writers are vnode lock protected.
* - fi_wgen is fif_mtx lock protected.
*/
struct fifoinfo {
struct socket *fi_readsock;
@ -223,14 +227,9 @@ fifo_open(ap)
}
/*
* General access to fi_readers and fi_writers is protected using
* the vnode lock.
*
* Protect the increment of fi_readers and fi_writers and the
* associated calls to wakeup() with the fifo mutex in addition
* to the vnode lock. This allows the vnode lock to be dropped
* for the msleep() calls below, and using the fifo mutex with
* msleep() prevents the wakeup from being missed.
* Use the fifo_mtx lock here, in addition to the vnode lock,
* in order to allow vnode lock dropping before msleep() calls
* and still avoiding missed wakeups.
*/
mtx_lock(&fifo_mtx);
if (ap->a_mode & FREAD) {
@ -249,6 +248,8 @@ fifo_open(ap)
if (ap->a_mode & FWRITE) {
if ((ap->a_mode & O_NONBLOCK) && fip->fi_readers == 0) {
mtx_unlock(&fifo_mtx);
if (fip->fi_writers == 0)
fifo_cleanup(vp);
return (ENXIO);
}
fip->fi_writers++;