|
|
1 | #include <sys/user.h> |
|
|
2 | #include <sys/ptrace.h> |
|
|
3 | |
1 | #define X_STACKSIZE 1024 * 128 + sizeof (long) * 64 * 1024 / 4 |
4 | #define X_STACKSIZE 1024 * 128 + sizeof (long) * 64 * 1024 / 4 |
2 | |
5 | |
3 | #include "xthread.h" |
6 | #include "xthread.h" |
4 | |
7 | |
5 | #include <errno.h> |
8 | #include <errno.h> |
… | |
… | |
132 | dbt_to_sv (SV *sv, DBT *dbt) |
135 | dbt_to_sv (SV *sv, DBT *dbt) |
133 | { |
136 | { |
134 | if (sv) |
137 | if (sv) |
135 | { |
138 | { |
136 | SvREADONLY_off (sv); |
139 | SvREADONLY_off (sv); |
137 | sv_setpvn_mg (sv, dbt->data, dbt->size); |
140 | sv_setsv_mg (sv, dbt->data ? newSVpvn (dbt->data, dbt->size) : &PL_sv_undef); |
138 | SvREFCNT_dec (sv); |
141 | SvREFCNT_dec (sv); |
139 | } |
142 | } |
140 | |
143 | |
|
|
144 | //assert (dbt->flags & DBT_MALLOC || !dbt->data); |
141 | free (dbt->data); |
145 | free (dbt->data); |
142 | } |
146 | } |
143 | |
147 | |
144 | enum { |
148 | enum { |
145 | REQ_QUIT, |
149 | REQ_QUIT, |
… | |
… | |
526 | on_next_submit = 0; |
530 | on_next_submit = 0; |
527 | |
531 | |
528 | PUSHMARK (SP); |
532 | PUSHMARK (SP); |
529 | PUTBACK; |
533 | PUTBACK; |
530 | call_sv (cb, G_DISCARD | G_EVAL); |
534 | call_sv (cb, G_DISCARD | G_EVAL); |
|
|
535 | SPAGAIN; |
531 | } |
536 | } |
532 | |
537 | |
533 | // synthesize callback if none given |
538 | // synthesize callback if none given |
534 | if (!req->callback) |
539 | if (!req->callback) |
535 | { |
540 | { |
… | |
… | |
543 | |
548 | |
544 | if (count != 2) |
549 | if (count != 2) |
545 | croak ("prepare callback must return exactly two values\n"); |
550 | croak ("prepare callback must return exactly two values\n"); |
546 | |
551 | |
547 | wait_callback = POPs; |
552 | wait_callback = POPs; |
548 | SvREFCNT_dec (req->callback); |
|
|
549 | req->callback = SvREFCNT_inc (POPs); |
553 | req->callback = SvREFCNT_inc (POPs); |
550 | } |
554 | } |
551 | |
555 | |
552 | ++nreqs; |
556 | ++nreqs; |
553 | |
557 | |
… | |
… | |
754 | } |
758 | } |
755 | |
759 | |
756 | --nready; |
760 | --nready; |
757 | |
761 | |
758 | X_UNLOCK (reqlock); |
762 | X_UNLOCK (reqlock); |
759 | |
763 | |
760 | switch (req->type) |
764 | switch (req->type) |
761 | { |
765 | { |
762 | case REQ_QUIT: |
766 | case REQ_QUIT: |
763 | req->result = ENOSYS; |
767 | req->result = ENOSYS; |
764 | goto quit; |
768 | goto quit; |