Hi Brian -

This won't work very well right now since Chapel's mechanism
for capturing functions is built upon classes and virtual
method calls - and also since currently the C interoperability
support doesn't understand function pointers.

I'd like to fix both of those things....

In the mean time, I think that the best you can do is to:
 * declare an extern proc in Chapel
 * create a C function calling the extern proc
 * tell Chapel that the C function is an opaque

Here is an example:

$ cat function_ptr.chpl

export proc proc_one() { writeln("in proc_one"); }

proc_one();

extern var call_proc_one:opaque;
extern proc call_fn_ptr(x);

call_fn_ptr(call_proc_one);


$ cat function_ptr.h

void proc_one(void);


static void call_proc_one(void) { proc_one(); }
static void call_fn_ptr(void (*fn)(void)) { fn(); }


$ chpl function_ptr.chpl function_ptr.h
$ ./a.out
in proc_one
in proc_one







Does this workaround solve your problem?

Cheers,

-michael

On 4/15/15, 12:14 PM, "Brian Guarraci" <[email protected]> wrote:

>Hi,
>
>
>What's the best way to declare an external C function that takes a
>function pointer?  I want to pass a Chapel implemented function or an
>externally implemented function.  I've done some research and experiments
>and haven't found a good solution yet.
>
>
>I originally (and naively) began with something like this in the Chapel
>module:
>
>
>proc ev_io_init_fn(ref loop: ev_loop_t, ref io: ev_io_t, x: c_int);
>extern proc ev_io_init(ref io: ev_io_t, ref fn: ev_io_init_fn, fd:
>ev_fd_t, events: ev_events_t);
>
>
>
>and then in chpl:
>
>
>export proc accept_cb(ref loop: ev_loop_t, ref watcher: ev_io_t, revents:
>c_int) {
>// do work
>}
>
>
>
>ev_io_init(w_accept, accept_cb, sd, EV_READ);
>
>
>
>but this (and similar approaches) will produce a compilation error akin
>to:
>
>
>chapel/chpl_tcp_server.chpl:38: error: unresolved call
>'ev_io_init(c_ptr(ev_io_t),
>chpl__fcf_type__ref_ev_loop_t__ref_ev_io_t_int32_t_void, int(32),
>int(32))' [functionResolution.cpp:2448]
>chapel/LibEv.chpl:75: note: candidates are: ev_io_init(io:
>c_ptr(ev_io_t), ref fn: ev_io_init_fn, fd: ev_fd_t, events: ev_events_t)
>[128267] [functionResolution.cpp:2463]
>
>
>
>
>Thanks!
>Brian
>
>
>
>
>


------------------------------------------------------------------------------
BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT
Develop your own process in accordance with the BPMN 2 standard
Learn Process modeling best practices with Bonita BPM through live exercises
http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- event?utm_
source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF
_______________________________________________
Chapel-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/chapel-developers

Reply via email to