Tanto en perlcall (en la sección "Estrategias para almacenar información de contexto de devolución de llamada") como en Extending and Embedding Perl (en la sección "Devolución de llamada") se enumeran 3 maneras diferentes de llamar sub rutinas Perl de llamadas XS/C:Registrando múltiples referencias secundarias de Perl para una biblioteca C en XS
- Inmediatamente: XS llama
- diferida: guardar el árbitro como un sub SV * para más adelante
- múltiple: save n árbitros sub para más adelante
El ejemplo y detalles enumerados para # 3 anterior utilizan un hash en XS para asociar la ref sub con una función de C en particular, pero predefinir un número fijo de funciones de C que no es adecuada.
Estoy trabajando en una interfaz XS a una biblioteca de C que utiliza devoluciones de llamada/punteros de función con argumentos opcionales por ejemplo:
blah(custom_type *o, void (*func) (void *data, int more_data), const void * data);
El bla C en esta biblioteca va a terminar llamando a la función pasa a lo largo de con los datos pasados.
Si es posible, me gustaría hacer un mapeo 1 a 1 de la API de C a la de Perl. p.ej.
blah($o, \&func, $data);
Actualmente, tengo el n. ° 2 anterior, pero otra llamada a blah() sobreescribiría el SV * guardado.
¿Cómo implementaría el # 3 anterior?
"salvar mi código Perl ref ... a llamar más tarde"? ¿Qué desencadena la llamada posterior? No está claro con qué parte estás teniendo problemas. Re "múltiple", ¿lo tienes trabajando para uno y quieres expandirlo? ¿O es solo parte de la tarea completa, aún no cumplida? – ysth
He actualizado la pregunta para poder aclararla –