--- IO-AIO/AIO.xs 2006/10/30 23:30:00 1.86 +++ IO-AIO/AIO.xs 2006/10/30 23:42:27 1.87 @@ -113,7 +113,6 @@ SV *callback, *fh; SV *sv1, *sv2; void *ptr1, *ptr2; - Stat_t *statdata; off_t offs; size_t size; ssize_t result; @@ -132,8 +131,9 @@ } aio_cb; enum { - FLAG_CANCELLED = 0x01, - FLAG_DATA_RO_OFF = 0x80, /* data was set readonly */ + FLAG_CANCELLED = 0x01, + FLAG_SV1_RO_OFF = 0x40, /* data was set readonly */ + FLAG_PTR2_FREE = 0x80, /* need free(ptr2) */ }; typedef aio_cb *aio_req; @@ -398,16 +398,9 @@ { dSP; - if (req->flags & FLAG_DATA_RO_OFF) + if (req->flags & FLAG_SV1_RO_OFF) SvREADONLY_off (req->sv1); - if (req->statdata) - { - PL_laststype = req->type == REQ_LSTAT ? OP_LSTAT : OP_STAT; - PL_laststatval = req->result; - PL_statcache = *(req->statdata); - } - if (!(req->flags & FLAG_CANCELLED) && SvOK (req->callback)) { ENTER; @@ -488,10 +481,21 @@ } break; + case REQ_STAT: + case REQ_LSTAT: + case REQ_FSTAT: + PL_laststype = req->type == REQ_LSTAT ? OP_LSTAT : OP_STAT; + PL_laststatval = req->result; + PL_statcache = *(Stat_t *)(req->ptr2); + PUSHs (sv_2mortal (newSViv (req->result))); + break; + case REQ_READ: SvCUR_set (req->sv1, req->stroffset + (req->result > 0 ? req->result : 0)); *SvEND (req->sv1) = 0; - /* fall through */ + PUSHs (sv_2mortal (newSViv (req->result))); + break; + default: PUSHs (sv_2mortal (newSViv (req->result))); break; @@ -540,9 +544,8 @@ SvREFCNT_dec (req->sv1); SvREFCNT_dec (req->sv2); SvREFCNT_dec (req->callback); - Safefree (req->statdata); - if (req->type == REQ_READDIR) + if (req->flags & FLAG_PTR2_FREE) free (req->ptr2); Safefree (req); @@ -999,6 +1002,7 @@ LOCK (wrklock); self->dirp = dirp = opendir (req->ptr1); self->dbuf = u = malloc (sizeof (*u)); + req->flags |= FLAG_PTR2_FREE; req->ptr2 = names = malloc (memlen); UNLOCK (wrklock); @@ -1104,9 +1108,9 @@ case REQ_READAHEAD: req->result = readahead (req->int1, req->offs, req->size); break; case REQ_SENDFILE: req->result = sendfile_ (req->int1, req->int2, req->offs, req->size, self); break; - case REQ_STAT: req->result = stat (req->ptr1, req->statdata); break; - case REQ_LSTAT: req->result = lstat (req->ptr1, req->statdata); break; - case REQ_FSTAT: req->result = fstat (req->int1, req->statdata); break; + case REQ_STAT: req->result = stat (req->ptr1, (Stat_t *)req->ptr2); break; + case REQ_LSTAT: req->result = lstat (req->ptr1, (Stat_t *)req->ptr2); break; + case REQ_FSTAT: req->result = fstat (req->int1, (Stat_t *)req->ptr2); break; case REQ_OPEN: req->result = open (req->ptr1, req->int1, req->mode); break; case REQ_CLOSE: req->result = close (req->int1); break; @@ -1402,7 +1406,7 @@ if (!SvREADONLY (data)) { SvREADONLY_on (data); - req->flags |= FLAG_DATA_RO_OFF; + req->flags |= FLAG_SV1_RO_OFF; } REQ_SEND; @@ -1485,13 +1489,15 @@ { dREQ; - New (0, req->statdata, 1, Stat_t); - if (!req->statdata) + req->ptr2 = malloc (sizeof (Stat_t)); + if (!req->ptr2) { req_free (req); - croak ("out of memory during aio_req->statdata allocation"); + croak ("out of memory during aio_req statdata allocation"); } + req->flags |= FLAG_PTR2_FREE; + if (SvPOK (fh_or_path)) { req->type = ix; @@ -1523,7 +1529,7 @@ req->type = ix; req->sv1 = newSVsv (pathname); req->ptr1 = SvPVbyte_nolen (pathname); - + REQ_SEND; }