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