concurrency problem with pointers

evilrat evilrat666 at gmail.com
Fri Jul 19 09:00:13 PDT 2013


On Friday, 19 July 2013 at 15:36:33 UTC, Ali Çehreli wrote:
>
> Error: static assert  "Aliases to mutable thread-local data not 
> allowed."
>        instantiated from here: send!(void*)
>
> Is that the problem? (If so, why don't you say so? ;))
>
> Then there are two solutions:
>
> a) Make _wnd a shared(GLFWwindow):
>
> struct Window {
>     // ...
>
>     shared(GLFWwindow)* _wnd;
> }
>
> The code now compiles.
>
> b) As Sean Kelly said, cast to shared before sending:
>
>         send(tid, cast(shared(GLFWwindow)*)_wnd );
>
> With the b option you may need to change the definition of the 
> receiving delegate to shared as well:
>
>             (const(shared(GLFWwindow)*) window) { }
>
> But that change is not needed in that simple code.

unfortunately both variants fails for me, i think this is because 
GLFWwindow is (pre)defined as struct instead alias void :(

maybe there is something to override type definition without 
modifying 3rd party libraries code?

/Users/evilrat/Documents/prog/Derelict3/import/derelict/glfw3/types.d(290): 
Error: struct derelict.glfw3.types.GLFWwindow unknown size
/Users/evilrat/Documents/prog/Derelict3/import/derelict/glfw3/types.d(290): 
Error: struct derelict.glfw3.types.GLFWwindow no size yet for 
forward reference

anyway thanks to both authors, now i could avoid such problems in 
the future \0/
>
> P.S. Additionally, the const on the receiving side probably 
> should apply only to what is being pointed at (as opposed to 
> the pointer itself):
>
>             (const(GLFWwindow)* window) { }

ah yes, such a shame. i'm sometimes forgot about this little 
detail :(


More information about the Digitalmars-d-learn mailing list