#include <pari/pari.h>
GEN
Cworker(GEN d, long kind) { return kind? det(d): Z_factor(d); }
int
main(void)
{
long i, taskid, pending;
GEN M,N1,N2, in,out, done;
struct pari_mt pt;
entree ep = {"_worker",0,(void*)Cworker,20,"GL",""};
pari_init_opts(8000000,500000, INIT_JMPm|INIT_SIGm|INIT_DFTm|INIT_noIMTm);
pari_add_function(&ep);
pari_mt_init();
N1 = addis(int2n(256), 1);
N2 = subis(int2n(193), 1);
M = mathilbert(80);
in = mkvec3(mkvec2(N1,gen_0), mkvec2(N2,gen_0), mkvec2(M,gen_1));
out = cgetg(4,t_VEC);
mt_queue_start(&pt, strtofunction("_worker"));
for (i = 1; i <= 3 || pending; i++)
{
mt_queue_submit(&pt, i, i<=3? gel(in,i): NULL);
done = mt_queue_get(&pt, &taskid, &pending);
if (done) gel(out,taskid) = done;
}
mt_queue_end(&pt);
output(out); pari_close(); return 0;
}