summaryrefslogtreecommitdiffstats
path: root/sys/sys/file.h
diff options
context:
space:
mode:
authorattilio <attilio@FreeBSD.org>2008-05-25 14:57:43 +0000
committerattilio <attilio@FreeBSD.org>2008-05-25 14:57:43 +0000
commit4d240aa98e28b74ea9808f1ed3cd852399f4c1ba (patch)
treeefe0ea20cbccbb0a37624368357258c8142915a2 /sys/sys/file.h
parent4789bb571576fe780e5fe461fafb8f80a4f043e1 (diff)
downloadFreeBSD-src-4d240aa98e28b74ea9808f1ed3cd852399f4c1ba.zip
FreeBSD-src-4d240aa98e28b74ea9808f1ed3cd852399f4c1ba.tar.gz
Replace direct atomic operation for the file refcount witht the
refcount interface. It also introduces the correct usage of memory barriers, as sometimes fdrop() and fhold() are used with shared locks, which don't use any release barrier.
Diffstat (limited to 'sys/sys/file.h')
-rw-r--r--sys/sys/file.h8
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/sys/file.h b/sys/sys/file.h
index e3fdd60..3b05440 100644
--- a/sys/sys/file.h
+++ b/sys/sys/file.h
@@ -39,6 +39,7 @@
#include <sys/unistd.h>
#else
#include <sys/queue.h>
+#include <sys/refcount.h>
#include <sys/_lock.h>
#include <sys/_mutex.h>
@@ -116,7 +117,7 @@ struct file {
short f_type; /* descriptor type */
short f_vnread_flags; /* (f) Sleep lock for f_offset */
volatile u_int f_flag; /* see fcntl.h */
- volatile int f_count; /* reference count */
+ volatile u_int f_count; /* reference count */
/*
* DTYPE_VNODE specific fields.
*/
@@ -196,9 +197,10 @@ int fgetvp_write(struct thread *td, int fd, struct vnode **vpp);
int fgetsock(struct thread *td, int fd, struct socket **spp, u_int *fflagp);
void fputsock(struct socket *sp);
-#define fhold(fp) atomic_add_int(&(fp)->f_count, 1)
+#define fhold(fp) \
+ (refcount_acquire(&(fp)->f_count))
#define fdrop(fp, td) \
- (atomic_fetchadd_int(&(fp)->f_count, -1) <= 1 ? _fdrop((fp), (td)) : 0)
+ (refcount_release(&(fp)->f_count) ? _fdrop((fp), (td)) : 0)
static __inline fo_rdwr_t fo_read;
static __inline fo_rdwr_t fo_write;
OpenPOWER on IntegriCloud