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 19:14:06 +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 Content-Language: en-US X-Notice: Filtered by postfilter v. 0.8.2 Xref: news.eternal-september.org comp.lang.ada:48475 Date: 2017-10-14T19:14:06+02:00 List-Id: On 2017-10-14 18:34, Victor Porton wrote: > Dmitry A. Kazakov wrote: > >> On 2017-10-14 17:17, Victor Porton wrote: >>> Dmitry A. Kazakov wrote: >>> >>>> On 2017-10-14 16:24, Victor Porton wrote: >>>> >>>>> I mean, it is because we cannot change C standard for better >>>>> compatibility with Ada. But we can change Ada 202x for better >>>>> compatibility with C libraries. >>>> >>>> There is nothing incompatible in what you described. >>>> >>>> There are many C libraries (most?) which cannot deal with objects >>>> allocated outside, e.g. in an Ada pool. There was never a big problem to >>>> communicate with such libraries. >>> >>> I want to create an Ada pool which does the same (de)allocation as a C >>> library. >>> >>> The problem is that creating such a pool is (seemingly) impossible with >>> current Ada RM. >> >> It is possible as I explained. You allocate additional information in >> front of the object and shift address. Upon deallocation you use that >> information to shift the address back before passing it to C's free. The >> same technique is used when handling Ada's array address issue in Simple >> Components. > > Again: > > You propose to allocate some additional data before value of a C struct T. > > But then I cannot pass the allocated pointer to C functions, instead I pass > the pointer + some shift value. No. Address is passed to Ada. There is no reason to pass any Ada pointers to any C functions except than in the form of "user data". > But C side may call a *_free() function on the passed pointer. If the > pointer after shifting is different than before shifting, then *_free() > would do a very wrong thing! No it cannot. You cannot deallocate any Ada objects from C because they require finalization. A custom Ada storage pool backed by whatever C memory management library is perfectly possible even of C cannot handle alignment. As I explained Addresses are shifted forth and back between malloc-Allocate and Deallocate-free pairs. Any other method of interaction is simply illegal because of finalization issues. If an object must be freed by C, it must a C object. If that is necessary, then for each C object an Ada object is created. See GtkAda for an example how such situations are handled. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de