What are done and status here?

On Sat, Feb 1, 2014 at 9:52 AM, Tim Holy <[email protected]> wrote:

> Thanks Jameson, that worked great.
>
> Since this took me into areas of Julia that I hadn't previously explored, I
> thought I'd post a complete example below. I suspect that something along
> these lines needs to be added to
> http://docs.julialang.org/en/latest/manual/calling-c-and-fortran-
> code/#passing-julia-callback-functions-to-c
> Thoughts?
>
> --Tim
>
>
> # Writing thread-safe callback functions for interfacing with
> # C libraries. As an example, this uses wait/notify on a condition.
>
> c = Condition()
>
> # Here's your function that you'd like to be the callback function.
> # This will get executed indirectly, by scheduling it to run from the
> # Julia event loop. It must have two inputs (which will have
> # types SingleAsyncWork and Cint, respectively).
> runnotify = (data, status) -> notify(c)
>
> # Create an object that can be used to schedule a call of runnotify
> # by Julia's event loop
> notifyasync = Base.SingleAsyncWork(runnotify)
>
> # Now create a C callback function that will issue uv_async_send, passing
> # notifyasync.handle as its input.
> # It should be set up to match the expected syntax of the C callback.
> # Here we do it for the callback syntax of pthread_create.
> async_send_pthread(func::Ptr{Void}) = (ccall(:uv_async_send,Cint,
> (Ptr{Void},),func); C_NULL)
> const c_async_send_pthread = cfunction(async_send_pthread, Ptr{Void},
> (Ptr{Void},))
>
> threads = Uint64[0]
>
> @sync begin
>     @async begin
>         println("About to wait from 1")
>         wait(c)
>         println("Done waiting from 1")
>     end
>     @async begin
>         println("About to notify from 2")
>         # Perform the equivalent of notify(c) from a new thread
>         ccall(:pthread_create, Cint, (Ptr{Void}, Ptr{Void}, Ptr{Void},
> Ptr{Void}),
>               threads, C_NULL, c_async_send_pthread, notifyasync.handle)
>         ccall(:pthread_join, Cint, (Uint64, Ptr{Void}), threads[1], C_NULL)
>         println("Done notifying from 2")
>     end
>     nothing
> end
>
>

Reply via email to