Module Name:    src
Committed By:   riastradh
Date:           Tue Jan 26 01:05:17 UTC 2016

Modified Files:
        src/share/man/man9: pserialize.9

Log Message:
Suggest the cacheline-aligned global struct idiom.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/share/man/man9/pserialize.9

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/share/man/man9/pserialize.9
diff -u src/share/man/man9/pserialize.9:1.10 src/share/man/man9/pserialize.9:1.11
--- src/share/man/man9/pserialize.9:1.10	Mon Mar  9 01:55:09 2015
+++ src/share/man/man9/pserialize.9	Tue Jan 26 01:05:17 2016
@@ -1,4 +1,4 @@
-.\"	$NetBSD: pserialize.9,v 1.10 2015/03/09 01:55:09 riastradh Exp $
+.\"	$NetBSD: pserialize.9,v 1.11 2016/01/26 01:05:17 riastradh Exp $
 .\"
 .\" Copyright (c) 2011 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -24,7 +24,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd November 21, 2014
+.Dd January 26, 2016
 .Dt PSERIALIZE 9
 .Os
 .Sh NAME
@@ -81,9 +81,11 @@ Given a global database of frotz records
 		struct frotz	*f_next;
 	};
 
-	kmutex_t frobbotzim_lock;
-	struct frotz *frobbotzim;
-	pserialize_t frobbotzim_psz;
+	static struct {
+		kmutex_t	lock;
+		pserialize_t	psz;
+		struct frotz	*first;
+	} frobbotzim __cacheline_aligned;
 .Ed
 .Pp
 Create a frotz and publish it, as a writer:
@@ -93,15 +95,15 @@ Create a frotz and publish it, as a writ
 	/* Initialize f.  */
 	...
 
-	mutex_enter(\*[Am]frobbotzim_lock);
-	f->f_next = frobbotzim;
+	mutex_enter(\*[Am]frobbotzim.lock);
+	f->f_next = frobbotzim.first;
 	/*
 	 * Publish the contents of f->f_next before we publish the
-	 * pointer to f in frobbotzim.
+	 * pointer to f in frobbotzim.first.
 	 */
 	membar_producer();
-	frobbotzim = f;
-	mutex_exit(\*[Am]frobbotzim_lock);
+	frobbotzim.first = f;
+	mutex_exit(\*[Am]frobbotzim.lock);
 .Ed
 .Pp
 Find a frotz, as a reader:
@@ -111,7 +113,7 @@ Find a frotz, as a reader:
 	int s;
 
 	s = pserialize_read_enter();
-	for (f = frobbotzim; f != NULL; f = f->f_next) {
+	for (f = frobbotzim.first; f != NULL; f = f->f_next) {
 		/* Fetch f before we fetch anything f points to.  */
 		membar_datadep_consumer();
 		if (f->f_... == key) {
@@ -130,8 +132,8 @@ readers:
 .Bd -literal
 	struct frotz **fp, *f;
 
-	mutex_enter(\*[Am]frobbotzim_lock);
-	for (fp = \*[Am]frobbotzim; (f = *fp) != NULL; fp = &f->f_next) {
+	mutex_enter(\*[Am]frobbotzim.lock);
+	for (fp = \*[Am]frobbotzim.first; (f = *fp) != NULL; fp = &f->f_next) {
 		if (f->f_... == key) {
 			/*
 			 * Unhook it from the list.  Readers may still
@@ -147,9 +149,9 @@ readers:
 	 * Wait for all existing readers to complete.  New readers will
 	 * not see f because the list no longer points to it.
 	 */
-	pserialize_perform(frobbotzim_psz);
+	pserialize_perform(frobbotzim.psz);
 	/* Now nobody else can be touching f, so it is safe to free.  */
-	mutex_exit(\*[Am]frobbotzim_lock);
+	mutex_exit(\*[Am]frobbotzim.lock);
 
 	if (f != NULL)
 		pool_put(\*[Am]frotz_pool, f);

Reply via email to