From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!feeder.eternal-september.org!aioe.org!.POSTED!not-for-mail From: "Dmitry A. Kazakov" Newsgroups: comp.lang.ada Subject: Re: Allocators design flaw Date: Sat, 14 Oct 2017 09:27:13 +0200 Organization: Aioe.org NNTP Server Message-ID: References: NNTP-Posting-Host: MajGvm9MbNtGBKE7r8NgYA.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 X-Notice: Filtered by postfilter v. 0.8.2 Content-Language: en-US Xref: news.eternal-september.org comp.lang.ada:48446 Date: 2017-10-14T09:27:13+02:00 List-Id: On 2017-10-14 04:53, Victor Porton wrote: > It is impossible to properly implement an allocator through a C function > (such as raptor_alloc_memory() from Raptor C library) which allocates a > struct and returns the pointer to the allocated struct. > > It is because RM13.11(21.5/3) "The Alignment parameter is a nonzero integral > multiple of D'Alignment..." > > (If it were "The Alignment parameter is equal to D'Alignment", then we would > be able just to check (in Allocate procedure implementation) that > > pragma Assert(Dummy_Record'Alignment mod Alignment = 0); > -- where Dummy_Record is an arbitrary C-convention record > -- (as all C records have the same alignment reqs) > > So Alignment parameter may be arbitrarily big and the C function alignment > may not conform to it. Usually allocators return addresses already rounded and there is nothing to worry about. > Let us think how to work around (in Ada 202x) of this design flaw. If any it is _alloc_memory() flaw, not Ada's. Add max alignment + log max alignment - 1 to the desired size. Add log max alignment to the returned address and round to the required alignment. Place the offset to original address in front (log alignment length). Return the rounded address. When freed use the stored offset to get the original address. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de