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!feeder.eternal-september.org!aioe.org!.POSTED!not-for-mail From: "Dmitry A. Kazakov" Newsgroups: comp.lang.ada Subject: Re: Reference counter in smart pointers are not updated properly when used by multiple tasks Date: Thu, 1 Feb 2018 09:39:23 +0100 Organization: Aioe.org NNTP Server Message-ID: References: NNTP-Posting-Host: MyFhHs417jM9AgzRpXn7yg.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 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 Content-Language: en-US X-Notice: Filtered by postfilter v. 0.8.2 Xref: reader02.eternal-september.org comp.lang.ada:50241 Date: 2018-02-01T09:39:23+01:00 List-Id: On 01/02/2018 06:52, onox wrote: > So the smart pointers are not working properly when there are jobs (paired with the same > smart pointer) being executed by multiple workers. Depends on the implementation. Surely handling reference counts must be done in a task-safe manner, e.g. through a protected action. Pragma Atomic is no help here. > I'm not sure if this is a bug in my > own code or whether GNAT is doing something funky in the Finalize procedure. I never had problems with that. > Can someone provide some insight? 1. I have two implementations, one with heavy logging/tracing the actions taken on reference counts. 2. There is gnatmem, which works surprisingly good. Reference-counted objects are allocated in the pool, so most of bugs are also memory leaks. 3. Controlled objects are tagged and thus passed by reference. It is important to remember when passing controlled handles/smart pointers around. A usual schema for dealing with shared linked structures like graphs is to clone its parts when updated under concurrent access. The case is detected using the reference count value > n, where n is the number of "owned" references. That n depends on parameter passing mechanism, which is, as I said, by-reference. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de