comp.lang.ada
 help / color / mirror / Atom feed
* A trouble with writing thick bindings
@ 2014-07-26 16:20 Victor Porton
  2014-07-27  9:52 ` AdaMagica
  0 siblings, 1 reply; 2+ messages in thread
From: Victor Porton @ 2014-07-26 16:20 UTC (permalink / raw)


Here is a simplified variation of a real problem.

Consider C definitions:

struct URL {
  /* ... */
};

struct Triple {
  struct URL *first, *second, *third;
};

I have created URI_Type Ada object which holds an access to "struct URL"; 
and frees it when an URI_Type object is finalized.

Now I've realized this does not work well with struct Triple. If I 
initialize an URI_Type object from say "second" pointer from that structure, 
then it could be freed twice: By the URI_Type finalization and by the C 
function (which may also be wrapped into finalization of an Ada object) 
which free pointers to triples.

What to do? Maybe create a base class which would not do finalization?

Real C code on which my simplified example is based:

http://librdf.org/raptor/api/raptor2-section-uri.html
http://librdf.org/raptor/api/raptor2-section-triples.html

-- 
Victor Porton - http://portonvictor.org

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: A trouble with writing thick bindings
  2014-07-26 16:20 A trouble with writing thick bindings Victor Porton
@ 2014-07-27  9:52 ` AdaMagica
  0 siblings, 0 replies; 2+ messages in thread
From: AdaMagica @ 2014-07-27  9:52 UTC (permalink / raw)


RM sais that Finalize must be idempotempt, because you cannot know how often it will be called for some object. So where is the problem? Just define your Finalize version so that it is idempotent (i.e. does nothing if already done).

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2014-07-27  9:52 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-07-26 16:20 A trouble with writing thick bindings Victor Porton
2014-07-27  9:52 ` AdaMagica

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox