About the memory barrier in BSD libc

Martin Simmons martin at lispworks.com
Tue Apr 24 18:00:37 UTC 2012


>>>>> On Tue, 24 Apr 2012 19:58:42 +0300, Konstantin Belousov said:
> 
> +
> +	/*
> +	 * Lock the spinlock used to protect __sglue list walk in
> +	 * __sfp().  The __sfp() uses fp->_flags == 0 test as an
> +	 * indication of the unused FILE.
> +	 *
> +	 * Taking the lock prevents possible compiler or processor
> +	 * reordering of the writes performed before the final _flags
> +	 * cleanup, making sure that we are done with the FILE before
> +	 * it is considered available.
> +	 */
> +	STDIO_THREAD_LOCK();
>  	fp->_flags = 0;		/* Release this FILE for reuse. */
> +	STDIO_THREAD_UNLOCK();
>  	FUNLOCKFILE(fp);
>  	return (r);

Is that assumption about reordering correct?  I.e. is FreeBSD's spinlock a
two-way barrier?

It isn't unusual for the locking primitive to be a one-way barrier, i.e. (from
Linux kernel memory-barriers.txt) "Memory operations that occur before a LOCK
operation may appear to happen after it completes."  See also acq and rel in
atomic(9).

__Martin


More information about the freebsd-threads mailing list