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+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to