… | |
… | |
1330 | { |
1330 | { |
1331 | av_push (coro_ready [SvSTATE (coro_sv)->prio - PRIO_MIN], coro_sv); |
1331 | av_push (coro_ready [SvSTATE (coro_sv)->prio - PRIO_MIN], coro_sv); |
1332 | } |
1332 | } |
1333 | |
1333 | |
1334 | static SV * |
1334 | static SV * |
1335 | coro_deq (pTHX_ int min_prio) |
1335 | coro_deq (pTHX) |
1336 | { |
1336 | { |
1337 | int prio = PRIO_MAX - PRIO_MIN; |
1337 | int prio; |
1338 | |
1338 | |
1339 | min_prio -= PRIO_MIN; |
|
|
1340 | if (min_prio < 0) |
|
|
1341 | min_prio = 0; |
|
|
1342 | |
|
|
1343 | for (prio = PRIO_MAX - PRIO_MIN + 1; --prio >= min_prio; ) |
1339 | for (prio = PRIO_MAX - PRIO_MIN + 1; --prio >= 0; ) |
1344 | if (AvFILLp (coro_ready [prio]) >= 0) |
1340 | if (AvFILLp (coro_ready [prio]) >= 0) |
1345 | return av_shift (coro_ready [prio]); |
1341 | return av_shift (coro_ready [prio]); |
1346 | |
1342 | |
1347 | return 0; |
1343 | return 0; |
1348 | } |
1344 | } |
… | |
… | |
1384 | SV *prev_sv, *next_sv; |
1380 | SV *prev_sv, *next_sv; |
1385 | |
1381 | |
1386 | for (;;) |
1382 | for (;;) |
1387 | { |
1383 | { |
1388 | LOCK; |
1384 | LOCK; |
1389 | next_sv = coro_deq (aTHX_ PRIO_MIN); |
1385 | next_sv = coro_deq (aTHX); |
1390 | |
1386 | |
1391 | /* nothing to schedule: call the idle handler */ |
1387 | /* nothing to schedule: call the idle handler */ |
1392 | if (expect_false (!next_sv)) |
1388 | if (expect_false (!next_sv)) |
1393 | { |
1389 | { |
1394 | dSP; |
1390 | dSP; |