On Saturday, February 4, 2017 at 6:32:52 PM UTC+8, Axel Wagner wrote:
>
> The spec says this: 
> https://golang.org/ref/spec#Size_and_alignment_guarantees
> Now, I can't really read from this whether this applies to fields or not. 
> If it does, it would seem to me, that, indeed, WaitGroup wouldn't need to 
> use the trick it does.
>
> For the example you name: It isn't particularly telling, as on nacl (at 
> least on x86{,-64}, don't know a lot about ARM) pointers have 32 bits and 
> so does int, meaning both rddeadline and wrdeadline are indeed 64-bit 
> aligned.
>

Yes, there are 6 4-byte fields before the two 8-byte fields. 

Ok, then another question, is it safe to embed expvar.Float type in 32bit 
OSes?
https://golang.org/src/expvar/expvar.go?s=1577:1608#L55
 

>
> On Sat, Feb 4, 2017 at 11:12 AM, T L <tapi...@gmail.com <javascript:>> 
> wrote:
>
>>
>>
>> On Saturday, February 4, 2017 at 5:56:30 PM UTC+8, T L wrote:
>>>
>>>
>>>
>>> On Saturday, February 4, 2017 at 5:40:25 PM UTC+8, T L wrote:
>>>>
>>>>
>>>>
>>>> On Friday, February 3, 2017 at 10:44:26 PM UTC+8, Ian Lance Taylor 
>>>> wrote:
>>>>>
>>>>> On Fri, Feb 3, 2017 at 5:38 AM, T L <tapi...@gmail.com> wrote: 
>>>>> > Why does WaitGroup.state method check 64-bit alignment at run time? 
>>>>> > Why not make the state field as the first word of WaitGroup struct? 
>>>>> > 
>>>>> > // https://golang.org/src/sync/waitgroup.go?s=1857:1892#L20 
>>>>> > 
>>>>> > type WaitGroup struct { 
>>>>> > 
>>>>> > noCopy noCopy 
>>>>> > 
>>>>> > // 64-bit value: high 32 bits are counter, low 32 bits are waiter 
>>>>> count. 
>>>>> > 
>>>>> > // 64-bit atomic operations require 64-bit alignment, but 32-bit 
>>>>> > 
>>>>> > // compilers do not ensure it. So we allocate 12 bytes and then use 
>>>>> > 
>>>>> > // the aligned 8 bytes in them as state. 
>>>>>
>>>>> Doesn't this comment explain the problem? 
>>>>>
>>>>> Ian 
>>>>>
>>>>
>>>> Part of. Ok I get it now.
>>>>
>>>> BTW, I have another question, can an allocated local int64 value be 
>>>> relied upon to be 64-bit aligned?
>>>>
>>>>
>>> By search the usages of 64bit functions in atomic package in go source, 
>>> I think the answer should be yes.
>>> And the go source also imply any 8-byte sized fields, and the fields 
>>> followed 8-byte sized fields, in any struct are also relied upon to be 
>>> 64-bit aligned.
>>>
>>
>>
>> If this is true, why not define WaitGroup.state as uint64 directly?
>>
>> The following is the code in go src which thinks 8-byte sized fields in 
>> structs are also 64-bit aligned.
>>
>> // syscall/net_nacl.go
>>
>> type netFile struct {
>>     defaultFileImpl
>>     proto      *netproto
>>     sotype     int
>>     listener   *msgq
>>     packet     *msgq
>>     rd         *byteq
>>     wr         *byteq
>>
>> *    rddeadline int64    wrdeadline int64*
>>     addr       Sockaddr
>>     raddr      Sockaddr
>> }
>> ...
>>
>> func SetReadDeadline(fd int, t int64) error {
>>     f, err := fdToNetFile(fd)
>>     if err != nil {
>>         return err
>>     }
>>     *atomic.StoreInt64(&f.rddeadline, t)*
>>     return nil
>> }
>> ...
>>
>> func SetWriteDeadline(fd int, t int64) error {
>>     f, err := fdToNetFile(fd)
>>     if err != nil {
>>         return err
>>     }
>>    * atomic.StoreInt64(&f.wrdeadline, t)*
>>     return nil
>> }
>>
>>
>>  
>>
>>>  
>>>
>>>>  
>>>>
>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "golang-nuts" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to golang-nuts...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to