On Thu, 09 Dec 2010 11:38:00 -0500, Andrej Mitrovic <andrej.mitrov...@gmail.com> wrote:

I know I prefer using shared() when interfacing with C.

I've tried using __gshared once when interfacing with C code. But I
had crashes all the time, using shared instead made my app stable
again. It might be related to the way the C code worked, since
multiple threads were involved. Anyway.. that's my experience with
gshared..

__gshared is the equivalent of what normal globals used to be (in D1 and earlier versions of D2). It's the same as a global variable in C.

shared is exactly the same as __gshared except the compiler inserts memory barriers around reads/writes (the C compiler does not), and shared is a type modifier, so it's available in the TypeInfo of the variable. Some parts of the runtime use that to determine certain behaviors, and I am aware of one problem with __gshared that needs to be documented -- array appending.

__gshared is unprotected sharing, and the type system is not aware that it is shared. Can you remember what specifically you were doing with the variable?

BTW, __gshared should have no problems in a single-threadded app.

-Steve

On 12/9/10, Steven Schveighoffer <schvei...@yahoo.com> wrote:
On Thu, 09 Dec 2010 10:15:59 -0500, CrypticMetaphor
<crypticmetapho...@gmail.com> wrote:
And how I supposed to call the c function?

Mark the extern(C) integer as __gshared in D.  That will put it in the
global namespace instead of TLS.

e.g.:

extern(C) { // this is needed to make it available from C
   __gshared int globalFromD;
}

Reply via email to