Future-XS

 view release on metacpan or  search on metacpan

src/future.c  view on Meta::CPAN

568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
  if(future_is_ready(f2)) {
    if(!future_is_cancelled(f2))
      future_on_ready(f2, fseq);
    else if(flags & CB_CANCEL)
      future_cancel(fseq);
  }
  else {
    struct FutureXS *f2self = get_future(f2);
    struct FutureXSCallback cb2 = {
      .flags = CB_DONE|CB_FAIL|CB_IS_FUTURE,
      .code  = sv_rvweaken(newSVsv(fseq)),
    };
    push_callback(f2self, &cb2);
  }
 
  assert(SvREFCNT(f2) == 1);
  SvREFCNT_dec(f2);
}
else {
  SV *code = CB_NONSEQ_CODE(cb);

src/future.c  view on Meta::CPAN

714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
  SV *fseq = future_new_proto(f1);
  if(cb->flags & CB_SEQ_CANCEL)
    future_on_cancel(fseq, f1);
 
  cb->flags |= CB_DONE|CB_FAIL;
  if(cb->seq.thencode)
    cb->seq.thencode = wrap_cb(f1, "sequence", sv_2mortal(cb->seq.thencode));
  if(cb->seq.elsecode)
    cb->seq.elsecode = wrap_cb(f1, "sequence", sv_2mortal(cb->seq.elsecode));
  cb->seq.f = sv_rvweaken(newSVsv(fseq));
 
  push_callback(self, cb);
 
  return fseq;
}
 
// TODO: move to a hax/ file
#define CvNAME_FILE_LINE(cv)  S_CvNAME_FILE_LINE(aTHX_ cv)
static SV *S_CvNAME_FILE_LINE(pTHX_ CV *cv)
{

src/future.c  view on Meta::CPAN

895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
  if(!self->on_cancel)
    self->on_cancel = newAV();
 
  SV *rv = newSVsv((SV *)code);
  av_push(self->on_cancel, rv);
 
  if(is_future) {
    struct FutureXSRevocation *rev;
    Newx(rev, 1, struct FutureXSRevocation);
 
    rev->precedent_f = sv_rvweaken(newSVsv(f));
    rev->toclear_sv_at = sv_rvweaken(newRV_inc(rv));
 
    struct FutureXS *codeself = get_future(code);
    if(!codeself->revoke_when_ready)
      codeself->revoke_when_ready = newAV();
 
    av_push(codeself->revoke_when_ready, (SV *)rev);
  }
}
 
void Future_on_ready(pTHX_ SV *f, SV *code)

src/future.c  view on Meta::CPAN

1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
if(!self->pending_subs) {
  self->result = newAV_svn_dup(subs, n);
  mark_ready(self, f, "wait_all");
 
  return f;
}
 
CV *sub_on_ready = newXS(NULL, sub_on_ready_waitall, __FILE__);
cv_set_anysv_refcounted(sub_on_ready, newSVsv(f));
sv_rvweaken(CvXSUBANY_sv(sub_on_ready));
 
GV *gv = gv_fetchpvs("Future::XS::(wait_all callback)", GV_ADDMULTI, SVt_PVCV);
CvGV_set(sub_on_ready, gv);
CvANON_off(sub_on_ready);
 
for(Size_t i = 0; i < n; i++) {
  if(!future_is_ready(subs[i]))
    future_on_ready(subs[i], sv_2mortal(newRV_inc((SV *)sub_on_ready)));
}

src/future.c  view on Meta::CPAN

1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
  mark_ready(self, f, "wait_any");
 
  return f;
}
 
self->pending_subs = 0;
 
CV *sub_on_ready = newXS(NULL, sub_on_ready_waitany, __FILE__);
cv_set_anysv_refcounted(sub_on_ready, newSVsv(f));
sv_rvweaken(CvXSUBANY_sv(sub_on_ready));
 
GV *gv = gv_fetchpvs("Future::XS::(wait_any callback)", GV_ADDMULTI, SVt_PVCV);
CvGV_set(sub_on_ready, gv);
CvANON_off(sub_on_ready);
 
for(Size_t i = 0; i < n; i++) {
  if(future_is_cancelled(subs[i]))
    continue;
 
  future_on_ready(subs[i], sv_2mortal(newRV_inc((SV *)sub_on_ready)));

src/future.c  view on Meta::CPAN

1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
  copy_result(self, immediate_fail);
  cancel_pending_subs(self);
  mark_ready(self, f, "needs_all");
  return f;
}
 
self->pending_subs = 0;
 
CV *sub_on_ready = newXS(NULL, sub_on_ready_needsall, __FILE__);
cv_set_anysv_refcounted(sub_on_ready, newSVsv(f));
sv_rvweaken(CvXSUBANY_sv(sub_on_ready));
 
GV *gv = gv_fetchpvs("Future::XS::(needs_all callback)", GV_ADDMULTI, SVt_PVCV);
CvGV_set(sub_on_ready, gv);
CvANON_off(sub_on_ready);
 
for(Size_t i = 0; i < n; i++) {
  if(future_is_ready(subs[i]))
    continue;
 
  future_on_ready(subs[i], sv_2mortal(newRV_inc((SV *)sub_on_ready)));

src/future.c  view on Meta::CPAN

1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
  copy_result(self, immediate_done);
  cancel_pending_subs(self);
  mark_ready(self, f, "needs_any");
  return f;
}
 
self->pending_subs = 0;
 
CV *sub_on_ready = newXS(NULL, sub_on_ready_needsany, __FILE__);
cv_set_anysv_refcounted(sub_on_ready, newSVsv(f));
sv_rvweaken(CvXSUBANY_sv(sub_on_ready));
 
GV *gv = gv_fetchpvs("Future::XS::(needs_any callback)", GV_ADDMULTI, SVt_PVCV);
CvGV_set(sub_on_ready, gv);
CvANON_off(sub_on_ready);
 
for(Size_t i = 0; i < n; i++) {
  if(future_is_ready(subs[i]))
    continue;
 
  future_on_ready(subs[i], sv_2mortal(newRV_inc((SV *)sub_on_ready)));



( run in 0.331 second using v1.01-cache-2.11-cpan-fd5d4e115d8 )