… | |
… | |
1526 | RETVAL = coro_nready; |
1526 | RETVAL = coro_nready; |
1527 | OUTPUT: |
1527 | OUTPUT: |
1528 | RETVAL |
1528 | RETVAL |
1529 | |
1529 | |
1530 | # for async_pool speedup |
1530 | # for async_pool speedup |
1531 | SV * |
1531 | void |
1532 | _pool_1 (...) |
1532 | _pool_1 (SV *cb) |
1533 | CODE: |
1533 | CODE: |
1534 | { |
1534 | { |
1535 | int i, len; |
1535 | int i, len; |
1536 | HV *hv = (HV *)SvRV (coro_current); |
1536 | HV *hv = (HV *)SvRV (coro_current); |
1537 | AV *defav = GvAV (PL_defgv); |
1537 | AV *defav = GvAV (PL_defgv); |
1538 | SV *invoke = hv_delete (hv, "_invoke", sizeof ("_invoke") - 1, 0); |
1538 | SV *invoke = hv_delete (hv, "_invoke", sizeof ("_invoke") - 1, 0); |
1539 | AV *invoke_av; |
1539 | AV *invoke_av; |
1540 | |
1540 | |
1541 | if (!invoke) |
1541 | if (!invoke) |
1542 | XSRETURN_EMPTY; |
1542 | croak ("\3terminate\2\n"); |
1543 | |
1543 | |
1544 | hv_store (hv, "desc", sizeof ("desc") - 1, |
1544 | hv_store (hv, "desc", sizeof ("desc") - 1, |
1545 | newSVpvn ("[async_pool]", sizeof ("[async_pool]") - 1), 0); |
1545 | newSVpvn ("[async_pool]", sizeof ("[async_pool]") - 1), 0); |
1546 | |
1546 | |
1547 | invoke_av = (AV *)SvRV (invoke); |
1547 | invoke_av = (AV *)SvRV (invoke); |
1548 | len = av_len (invoke_av); |
1548 | len = av_len (invoke_av); |
1549 | |
1549 | |
1550 | RETVAL = SvREFCNT_inc (AvARRAY (invoke_av)[0]); |
1550 | sv_setsv (cb, AvARRAY (invoke_av)[0]); |
1551 | |
1551 | |
1552 | if (len > 0) |
1552 | if (len > 0) |
1553 | { |
1553 | { |
1554 | av_clear (defav); |
|
|
1555 | av_extend (defav, len); |
1554 | av_fill (defav, len - 1); |
1556 | for (i = 0; i < len; ++i) |
1555 | for (i = 0; i < len; ++i) |
1557 | av_store (defav, i, SvREFCNT_inc (AvARRAY (invoke_av)[i + 1])); |
1556 | av_store (defav, i, SvREFCNT_inc (AvARRAY (invoke_av)[i + 1])); |
1558 | } |
1557 | } |
1559 | |
1558 | |
1560 | SvREFCNT_dec (invoke); |
1559 | SvREFCNT_dec (invoke); |
1561 | } |
1560 | } |
1562 | OUTPUT: |
|
|
1563 | RETVAL |
|
|
1564 | |
1561 | |
1565 | void |
1562 | void |
1566 | _pool_2 (...) |
1563 | _pool_2 (SV *cb) |
1567 | CODE: |
1564 | CODE: |
1568 | { |
1565 | { |
1569 | struct coro *coro = SvSTATE (coro_current); |
1566 | struct coro *coro = SvSTATE (coro_current); |
|
|
1567 | |
|
|
1568 | sv_setsv (cb, &PL_sv_undef); |
1570 | |
1569 | |
1571 | if (coro_rss (coro) > SvIV (sv_pool_rss) |
1570 | if (coro_rss (coro) > SvIV (sv_pool_rss) |
1572 | || av_len (av_async_pool) + 1 >= SvIV (sv_pool_size)) |
1571 | || av_len (av_async_pool) + 1 >= SvIV (sv_pool_size)) |
1573 | XSRETURN_YES; |
1572 | croak ("\3terminate\2\n"); |
1574 | |
1573 | |
1575 | av_clear (GvAV (PL_defgv)); |
1574 | av_clear (GvAV (PL_defgv)); |
1576 | hv_store (SvRV (coro_current), "desc", sizeof ("desc") - 1, |
1575 | hv_store (SvRV (coro_current), "desc", sizeof ("desc") - 1, |
1577 | newSVpvn ("[async_pool idle]", sizeof ("[async_pool idle]") - 1), 0); |
1576 | newSVpvn ("[async_pool idle]", sizeof ("[async_pool idle]") - 1), 0); |
1578 | coro->save = CORO_SAVE_DEF; |
1577 | coro->save = CORO_SAVE_DEF; |
1579 | coro->prio = 0; |
1578 | coro->prio = 0; |
1580 | av_push (av_async_pool, newSVsv (coro_current)); |
1579 | av_push (av_async_pool, newSVsv (coro_current)); |
1581 | |
|
|
1582 | XSRETURN_NO; |
|
|
1583 | } |
1580 | } |
1584 | |
1581 | |
1585 | |
1582 | |
1586 | MODULE = Coro::State PACKAGE = Coro::AIO |
1583 | MODULE = Coro::State PACKAGE = Coro::AIO |
1587 | |
1584 | |