[M3devel] small objects

Tony Hosking hosking at cs.purdue.edu
Mon Mar 30 01:13:43 CEST 2009


No good if the tag bits are the same as unaligned pointers from the  
stack/registers -- we'd end up conservatively pinning pages that just  
happened to have addresses that coincide with the tagged values.

On 30 Mar 2009, at 07:25, Jay wrote:

>
> You can also depend on heap being somewhat aligned and use the lower  
> bits as "tag" bits. Like, if you need all 30bit integers to be not  
> heap allocated or somesuch.
>
> - Jay
>
>
> ----------------------------------------
>> From: jay.krell at cornell.edu
>> To: mika at async.caltech.edu; hendrik at topoi.pooq.com
>> CC: m3devel at elegosoft.com
>> Subject: RE: [M3devel] small objects
>> Date: Sun, 29 Mar 2009 20:19:32 +0000
>>
>>
>> Can we say that anything under 64K is invalid?
>> And in RTAllocator, do some gymnastics to make it so?
>> In particular, like:
>> if an allocation from memmap/malloc/sbrk is under 64K:
>> if it is "small", leak it, and try again
>> if it is "large", free it, and try again
>> This does not guarantee forward progress in the large case.
>> So, if it is large...?
>> Free it, allocate something small, if it is under 64K, leak it, and  
>> try again.
>> If it is not under 64K, free it, allocate something larger?'
>> This is better, but can still loop forever.
>>
>> I guess sbrk returns always increasing addresses?
>> If you chose 4K instead of 64K, easier/more portable, given that  
>> all existing systems have page size>=4K and NULL is invalid, so  
>> 0-4K are invalid.
>>
>> - Jay
>>
>>
>> ----------------------------------------
>>> To: hendrik at topoi.pooq.com
>>> Date: Sun, 29 Mar 2009 12:31:19 -0700
>>> From: mika at async.caltech.edu
>>> CC: m3devel at elegosoft.com
>>> Subject: Re: [M3devel] small objects
>>>
>>> I asked Tony about this and he said that currently it will confuse
>>> the GC but that it's a minor change.
>>>
>>> I wanted it for my proposed Smalltalk-in-M3 environment, which has
>>> since morphed to a Scheme-in-M3 environment (much easier to code),
>>> and I would still like it :-) (But I have plenty of other issues
>>> in my environment also that need my attention more urgently
>>> at the moment...)
>>>
>>> Mika
>>>
>>> hendrik at topoi.pooq.com writes:
>>>> There are many times I want to express data which could be  
>>>> efficiently
>>>> coded as the disjoing union of (small) integer and pointer to  
>>>> object.
>>>> The pointer-to-object is used in the case where tho objects are  
>>>> big;
>>>> the (small) integer for the more common case where the objects are
>>>> small.
>>>>
>>>> High-level languages seem to pe quite paranoid about admitting  
>>>> thise
>>>> kind of data into the fold, except maybe for Lisp systems, which  
>>>> have
>>>> been doing this from time immemorial. (I believe CAML does this,  
>>>> too).
>>>> These languages use it internally, and manage to (mostly) hide it  
>>>> from
>>>> the user.
>>>>
>>>> The X toolkit uses this trick too -- there's a constant  
>>>> somewhere, and
>>>> if an integer is less than this constant, it's passed to an X  
>>>> toolkit
>>>> function as an integer; otherwise by reference. The idea there is  
>>>> that
>>>> there's a range of addresses of storage that can never be used as
>>>> parameters for the X toolkit functions (presumably because of  
>>>> hardware
>>>> or OS limitations), and that the bit patterns that are  
>>>> unavailable for
>>>> addresses can be used as small integers.
>>>>
>>>> Now the semantics of such a union, efficiently coded, are quite  
>>>> clear.
>>>> There's a range of numbers that can be packed unamiguously into
>>>> pointers, and if your integer can be so packed, you do it;
>>>> otherwise you use a reference to sime kind of INTEGER object
>>>> elsewhere. There are operations for packing integers and object
>>>> pointers into such words, and others for unpacking them (complete  
>>>> with
>>>> type-test). The actual physical representation can be machine- or
>>>> implemetation dependent -- you could do a bit of shifting and pack
>>>> integers into words with the low bit set (if pointers to objects  
>>>> are
>>> usually aligned in some way, the integers will stand out as being
>>>> unalinged) Or you could use an uppoer bound on "small" integers,  
>>>> as C
>>>> does. And on a machine where such packing is impossible (for  
>>>> whatever
>>>> reason) you could simply set the upper bound of (the absolute alue
>>>> of) such packable integers to be zero, so there wouldn't be any.
>>>>
>>>> Is there any way such a thing can be done in Modula 3? Remember  
>>>> -- I do
>>>> want the garbage collector to be aware of such conventions and do  
>>>> proper
>>>> tracing on the pointers?
>>>>
>>>> (I suspect the answer is "no". But would be a pity.)
>>>>
>>>> -- hendrik




More information about the M3devel mailing list