Fix paginator counter on x86-32
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 9 Sep 2016 12:31:49 +0000 (14:31 +0200)
committerGitHub <noreply@github.com>
Fri, 9 Sep 2016 12:31:49 +0000 (14:31 +0200)
Atomic operations with 64 bit values must be aligned for 64-bit on x86-32.

According to the spec:

"The first word in a global variable or in an allocated struct or slice can be relied upon to be 64-bit aligned."

The above wasn't enough for the `paginationPageCount` on `SiteInfo`, maybe due to how `SiteInfo` is embedded.

This commit adds a 4 byte padding before the `uint64` that creates the correct alignment.

Fixes #2415

hugolib/site.go

index 8ffe0fad4793d33a208520450263c3ae8c348a8f..3e537c93ddbfa1dac18726ffa8bbc2b3a047b464 100644 (file)
@@ -155,7 +155,14 @@ type targetList struct {
 
 type SiteInfo struct {
        // atomic requires 64-bit alignment for struct field access
-       paginationPageCount   uint64
+       // According to the docs, " The first word in a global variable or in an
+       // allocated struct or slice can be relied upon to be 64-bit aligned."
+       // Moving paginationPageCount to the top of this struct didn't do the
+       // magic, maybe due to the way SiteInfo is embedded.
+       // Adding the 4 byte padding below does the trick.
+       _                   [4]byte
+       paginationPageCount uint64
+
        BaseURL               template.URL
        Taxonomies            TaxonomyList
        Authors               AuthorList