www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Using onOutOfMemoryError in C wrappers

reply Per =?UTF-8?B?Tm9yZGzDtnc=?= <per.nordlow gmail.com> writes:
When wrapping C code that tries to allocate memory resources via 
functions such as

     X* X_create();

should one call `onOutOfMemoryError();` upon null return?

Making more D wrappers `nothrow  nogc`.
Mar 24 2021
parent reply Basile B. <b2.temp gmx.com> writes:
On Wednesday, 24 March 2021 at 07:58:22 UTC, Per Nordlöw wrote:
 When wrapping C code that tries to allocate memory resources 
 via functions such as

     X* X_create();

 should one call `onOutOfMemoryError();` upon null return?

 Making more D wrappers `nothrow  nogc`.
There are several ways to do that. In addition to onOutOfMemoryError, you can use a static instance or `if (somePtr is null) assert(0);` void v() nogc nothrow { __gshared oom = new OutOfMemoryError(); auto X* = X_create(); if (X is null) throw oom; }
Mar 24 2021
next sibling parent reply Per =?UTF-8?B?Tm9yZGzDtnc=?= <per.nordlow gmail.com> writes:
On Wednesday, 24 March 2021 at 08:31:19 UTC, Basile B. wrote:
 There are several ways to do that. In addition to 
 onOutOfMemoryError, you can use a static instance

   void v()  nogc nothrow
   {
     __gshared oom = new OutOfMemoryError();
     auto X* = X_create();
     if (X is null)
         throw oom;
   }
How is that better than void v() nogc nothrow { auto X* = X_create(); if (X is null) onOutOfMemoryError(); } considering the fact that accessing `__gshared` state is neither ` safe` nor `pure`? Which, in turn, makes `v()` unconditionally unsafe and unpure regardless of safety and purity of `X_create()`.
Mar 24 2021
parent reply Basile B. <b2.temp gmx.com> writes:
On Wednesday, 24 March 2021 at 08:51:34 UTC, Per Nordlöw wrote:
 On Wednesday, 24 March 2021 at 08:31:19 UTC, Basile B. wrote:
 There are several ways to do that. In addition to 
 onOutOfMemoryError, you can use a static instance

   void v()  nogc nothrow
   {
     __gshared oom = new OutOfMemoryError();
     auto X* = X_create();
     if (X is null)
         throw oom;
   }
How is that better than void v() nogc nothrow { auto X* = X_create(); if (X is null) onOutOfMemoryError(); } considering the fact that accessing `__gshared` state is neither ` safe` nor `pure`? Which, in turn, makes `v()` unconditionally unsafe and unpure regardless of safety and purity of `X_create()`.
In now way. But in your question you mentioned nogc nothrow and not safe and pure.
Mar 24 2021
parent Per =?UTF-8?B?Tm9yZGzDtnc=?= <per.nordlow gmail.com> writes:
On Wednesday, 24 March 2021 at 10:25:21 UTC, Basile B. wrote:
 In now way. But in your question you mentioned  nogc nothrow 
 and not  safe and pure.
Ok, thanks. Note that core.exception.onOutOfMemoryError is already qualified as nogc nothrow pure trusted.
Mar 24 2021
prev sibling parent Jack <jckj33 gmail.com> writes:
On Wednesday, 24 March 2021 at 08:31:19 UTC, Basile B. wrote:
 On Wednesday, 24 March 2021 at 07:58:22 UTC, Per Nordlöw wrote:
 When wrapping C code that tries to allocate memory resources 
 via functions such as

     X* X_create();

 should one call `onOutOfMemoryError();` upon null return?

 Making more D wrappers `nothrow  nogc`.
There are several ways to do that. In addition to onOutOfMemoryError, you can use a static instance or `if (somePtr is null) assert(0);` void v() nogc nothrow { __gshared oom = new OutOfMemoryError(); auto X* = X_create(); if (X is null) throw oom; }
why are you creating oom variable before the if(x is null) check?
Mar 24 2021