int call_perl_sub(SV *routine, SV *data_hash) { dSP; /* Get the stack pointer. */ /* Allocate the temporary memory location. */ ENTER; SAVETMPS; PUSHMARK(SP); /* Get the temporary stack pointer. */ XPUSHs(sv_2mortal(data_hash)); /* Push the hash onto the stack. */ PUTBACK; /* Call the PERL subroutine, ignoring its return value. */ call_sv(routine, G_DISCARD); /* Free the allocated memory. */ FREETMPS; LEAVE; } /* End of function: call_perl_sub() */ MODULE = TestXS PACKAGE = TestXS void callback_sub(file_list, callback) SV *file_list; SV *callback; CODE: HV *inp_file_list = (HV *) SvRV(file_list); HE *next_entry = NULL; /* Initialize the iterator. */ hv_iterinit(inp_file_list); for (next_entry = hv_iternext(inp_file_list); next_entry != NULL; next_entry = hv_iternext(inp_file_list)) { I32 keylen = 0; SV *entry_val = hv_iterval(inp_file_list, next_entry); char *filepath = hv_iterkey(next_entry, &keylen); sv_setpv(entry_val, "Marked."); fprintf(stderr, "[UPDATED] %s ==>> %s\n", filepath, SvPV_nolen(entry_val)); call_perl_sub(callback, SvREFCNT_inc(file_list)); }