… | |
… | |
620 | errno = old_errno; |
620 | errno = old_errno; |
621 | |
621 | |
622 | mg->mg_obj = 0; /* just in case */ |
622 | mg->mg_obj = 0; /* just in case */ |
623 | |
623 | |
624 | SvREADONLY_off (sv); |
624 | SvREADONLY_off (sv); |
|
|
625 | |
|
|
626 | if (SvPVX (sv) != mg->mg_ptr) |
|
|
627 | croak ("ERROR: IO::AIO::mmap-mapped scalar changed location, detected"); |
|
|
628 | |
625 | SvCUR_set (sv, 0); |
629 | SvCUR_set (sv, 0); |
626 | SvLEN_set (sv, 0); |
|
|
627 | SvPVX (sv) = 0; |
630 | SvPVX (sv) = 0; |
628 | SvOK_off (sv); |
631 | SvOK_off (sv); |
629 | |
632 | |
630 | return 0; |
633 | return 0; |
631 | } |
634 | } |
… | |
… | |
1386 | int fd = SvOK (fh) ? s_fileno_croak (fh, flags & PROT_WRITE) : -1; |
1389 | int fd = SvOK (fh) ? s_fileno_croak (fh, flags & PROT_WRITE) : -1; |
1387 | void *addr = (void *)mmap (0, length, prot, flags, fd, offset); |
1390 | void *addr = (void *)mmap (0, length, prot, flags, fd, offset); |
1388 | if (addr == (void *)-1) |
1391 | if (addr == (void *)-1) |
1389 | XSRETURN_NO; |
1392 | XSRETURN_NO; |
1390 | |
1393 | |
|
|
1394 | sv_force_normal (scalar); |
|
|
1395 | |
1391 | /* we store the length in mg_obj, as namlen is I32 :/ */ |
1396 | /* we store the length in mg_obj, as namlen is I32 :/ */ |
1392 | sv_magicext (scalar, 0, MMAP_MAGIC, &mmap_vtbl, (char *)addr, 0) |
1397 | sv_magicext (scalar, 0, MMAP_MAGIC, &mmap_vtbl, (char *)addr, 0) |
1393 | ->mg_obj = (SV *)length; |
1398 | ->mg_obj = (SV *)length; |
1394 | |
1399 | |
1395 | SvUPGRADE (scalar, SVt_PV); /* nop... */ |
1400 | SvUPGRADE (scalar, SVt_PV); /* nop... */ |
|
|
1401 | |
1396 | if (!(prot & PROT_WRITE)) |
1402 | if (!(prot & PROT_WRITE)) |
1397 | SvREADONLY_on (scalar); |
1403 | SvREADONLY_on (scalar); |
|
|
1404 | |
|
|
1405 | if (SvLEN (scalar)) |
|
|
1406 | Safefree (SvPVX (scalar)); |
1398 | |
1407 | |
1399 | SvPVX (scalar) = (char *)addr; |
1408 | SvPVX (scalar) = (char *)addr; |
1400 | SvCUR_set (scalar, length); |
1409 | SvCUR_set (scalar, length); |
1401 | SvLEN_set (scalar, 0); |
1410 | SvLEN_set (scalar, 0); |
1402 | SvPOK_only (scalar); |
1411 | SvPOK_only (scalar); |