On Sat, Jan 26, 2019 at 6:50 PM <mountain...@gmail.com> wrote:
>
> I am looking at go1.11.1.

I don't see a "noscan" flag for mallocgc in 1.11.1.  There is a noscan
local variable, which is set of the type is passed as nil (the case I
mentioned earlier) or if the type has no pointers.

> The memory allocation is still difficult to understand. What reference 
> materials can help me understand the context of this block?

There is some information at golang.org/s/go14gc but I'm not sure it
quite covers what you are looking for.

Ian


> 在 2019年1月27日星期日 UTC+8上午3:03:47,Ian Lance Taylor写道:
>>
>> On Sat, Jan 26, 2019 at 5:37 AM <mount...@gmail.com> wrote:
>> >
>> >  Why the garbage collector won't know how to find the pointers?
>> >  I looked at mallocgc and decided if the GC needs to scan this object 
>> > based on the noscan flag.
>>
>> What version of Go are you looking at?  There was a flagNoScan as late
>> as Go 1.6, but there is no such flag in current versions of Go.
>>
>> Ian
>>
>> > 在 2019年1月25日星期五 UTC+8下午10:58:44,Ian Lance Taylor写道:
>> >>
>> >> On Thu, Jan 24, 2019 at 11:58 PM <mount...@gmail.com> wrote:
>> >> >
>> >> > go 1.11.1 source code is below:
>> >> >
>> >> > Generally speaking, make chan just pay attention to the presence or 
>> >> > absence of buf.
>> >> >
>> >> > When I saw the source code of make chan,  I can understand case 1: chan 
>> >> > buf is 0, but can't understand case 2 & default.
>> >> >
>> >> > Who knows this principle?
>> >> >
>> >> > Thanks!
>> >> >
>> >> > var c *hchan
>> >> >     switch {
>> >> >     case size == 0 || elem.size == 0:
>> >> >         // Queue or element size is zero.
>> >> >         c = (*hchan)(mallocgc(hchanSize, nil, true))
>> >> >         // Race detector uses this location for synchronization.
>> >> >         c.buf = c.raceaddr()
>> >> >     case elem.kind&kindNoPointers != 0:
>> >> >         // Elements do not contain pointers.
>> >> >         // Allocate hchan and buf in one call.
>> >> >         c = (*hchan)(mallocgc(hchanSize+uintptr(size)*elem.size, nil, 
>> >> > true))
>> >> >         c.buf = add(unsafe.Pointer(c), hchanSize)
>> >> >     default:
>> >> >         // Elements contain pointers.
>> >> >         c = new(hchan)
>> >> >         c.buf = mallocgc(uintptr(size)*elem.size, elem, true)
>> >> >     }
>> >>
>> >>
>> >> First, let me say: please don't post screen shots.  They are much
>> >> harder to read than ordinary text.  I don't understand why anybody
>> >> ever posts screenshots of code, and I would be grateful for an
>> >> explanation.  Thanks.
>> >>
>> >> What is happening in that code is that if the channel has a non-zero
>> >> buffer size, we need to allocate space to hold the elements in the
>> >> buffer.  If the elements in the buffer do not contain any pointers, we
>> >> can optimize by allocating the channel structure (hchan) and the
>> >> buffer in a single memory allocation.  If the elements do contain
>> >> pointers, then that won't work, because the garbage collector won't
>> >> know how to find the pointers.  So in that case we allocate the hchan
>> >> struct and the buffer separately.  Note the second argument to
>> >> mallocgc, which is the type of the memory being allocated.  When there
>> >> are no pointers, we pass nil, which tells the garbage collector that
>> >> the allocation contains no pointers.  In the pointer case, we pass the
>> >> element type.
>> >>
>> >> Ian
>> >
>> > --
>> > 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.
>> > 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.

-- 
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