summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MANIFEST2
-rwxr-xr-xPorting/Maintainers.pl6
-rw-r--r--ext/PerlIO-mmap/mmap.pm30
-rw-r--r--ext/PerlIO-mmap/mmap.xs320
-rw-r--r--lib/.gitignore1
-rw-r--r--lib/PerlIO.pm29
-rw-r--r--perlio.c298
-rw-r--r--perliol.h14
8 files changed, 373 insertions, 327 deletions
diff --git a/MANIFEST b/MANIFEST
index 564955733f..f09f58e4d7 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -3787,6 +3787,8 @@ ext/PerlIO-encoding/MANIFEST PerlIO::encoding list of files
ext/PerlIO-encoding/t/encoding.t See if PerlIO encoding conversion works
ext/PerlIO-encoding/t/fallback.t See if PerlIO fallbacks work
ext/PerlIO-encoding/t/nolooping.t Tests for PerlIO::encoding
+ext/PerlIO-mmap/mmap.pm PerlIO layer for memory maps
+ext/PerlIO-mmap/mmap.xs PerlIO layer for memory maps
ext/PerlIO-scalar/scalar.pm PerlIO layer for scalars
ext/PerlIO-scalar/scalar.xs PerlIO layer for scalars
ext/PerlIO-scalar/t/scalar.t See if PerlIO::scalar works
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index ccb2db64f1..3f1f5c4552 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -1407,6 +1407,12 @@ use File::Glob qw(:case);
'UPSTREAM' => 'blead',
},
+ 'PerlIO::mmap' => {
+ 'MAINTAINER' => 'p5p',
+ 'FILES' => q[ext/PerlIO-mmap],
+ 'UPSTREAM' => 'blead',
+ },
+
'PerlIO::scalar' => {
'MAINTAINER' => 'p5p',
'FILES' => q[ext/PerlIO-scalar],
diff --git a/ext/PerlIO-mmap/mmap.pm b/ext/PerlIO-mmap/mmap.pm
new file mode 100644
index 0000000000..7db4a55137
--- /dev/null
+++ b/ext/PerlIO-mmap/mmap.pm
@@ -0,0 +1,30 @@
+package PerlIO::mmap;
+use strict;
+use warnings;
+our $VERSION = '0.010';
+
+use XSLoader;
+XSLoader::load(__PACKAGE__, __PACKAGE__->VERSION);
+
+1;
+
+__END__
+
+=head1 NAME
+
+PerlIO::mmap - Memory mapped IO
+
+=head1 SYNOPSIS
+
+ open my $fh, '<:mmap', $filename;
+
+=head1 DESCRIPTION
+
+This layer does C<read> and C<write> operations by mmap()ing the file if possible, but falls back to the default behavior if not.
+
+=head1 IMPLEMENTATION NOTE
+
+C<PerlIO::mmap> only exists to use XSLoader to load C code that provides support for using memory mapped IO. One does not need to explicitly C<use PerlIO::mmap;>.
+
+=cut
+
diff --git a/ext/PerlIO-mmap/mmap.xs b/ext/PerlIO-mmap/mmap.xs
new file mode 100644
index 0000000000..3e87d3b371
--- /dev/null
+++ b/ext/PerlIO-mmap/mmap.xs
@@ -0,0 +1,320 @@
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
+
+#define PERL_NO_GET_CONTEXT
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#if defined(PERLIO_LAYERS) && defined(HAS_MMAP)
+
+#include "perliol.h"
+#include <sys/mman.h>
+
+/*
+ * mmap as "buffer" layer
+ */
+
+typedef struct {
+ PerlIOBuf base; /* PerlIOBuf stuff */
+ Mmap_t mptr; /* Mapped address */
+ Size_t len; /* mapped length */
+ STDCHAR *bbuf; /* malloced buffer if map fails */
+} PerlIOMmap;
+
+IV
+PerlIOMmap_map(pTHX_ PerlIO *f)
+{
+ dVAR;
+ PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
+ const IV flags = PerlIOBase(f)->flags;
+ IV code = 0;
+ if (m->len)
+ abort();
+ if (flags & PERLIO_F_CANREAD) {
+ PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
+ const int fd = PerlIO_fileno(f);
+ Stat_t st;
+ code = Fstat(fd, &st);
+ if (code == 0 && S_ISREG(st.st_mode)) {
+ SSize_t len = st.st_size - b->posn;
+ if (len > 0) {
+ Off_t posn;
+ if (PL_mmap_page_size <= 0)
+ Perl_croak(aTHX_ "panic: bad pagesize %" IVdf,
+ PL_mmap_page_size);
+ if (b->posn < 0) {
+ /*
+ * This is a hack - should never happen - open should
+ * have set it !
+ */
+ b->posn = PerlIO_tell(PerlIONext(f));
+ }
+ posn = (b->posn / PL_mmap_page_size) * PL_mmap_page_size;
+ len = st.st_size - posn;
+ m->mptr = (Mmap_t)mmap(NULL, len, PROT_READ, MAP_SHARED, fd, posn);
+ if (m->mptr && m->mptr != (Mmap_t) - 1) {
+#if 0 && defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
+ madvise(m->mptr, len, MADV_SEQUENTIAL);
+#endif
+#if 0 && defined(HAS_MADVISE) && defined(MADV_WILLNEED)
+ madvise(m->mptr, len, MADV_WILLNEED);
+#endif
+ PerlIOBase(f)->flags =
+ (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
+ b->end = ((STDCHAR *) m->mptr) + len;
+ b->buf = ((STDCHAR *) m->mptr) + (b->posn - posn);
+ b->ptr = b->buf;
+ m->len = len;
+ }
+ else {
+ b->buf = NULL;
+ }
+ }
+ else {
+ PerlIOBase(f)->flags =
+ flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
+ b->buf = NULL;
+ b->ptr = b->end = b->ptr;
+ code = -1;
+ }
+ }
+ }
+ return code;
+}
+
+IV
+PerlIOMmap_unmap(pTHX_ PerlIO *f)
+{
+ PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
+ IV code = 0;
+ if (m->len) {
+ PerlIOBuf * const b = &m->base;
+ if (b->buf) {
+ /* The munmap address argument is tricky: depending on the
+ * standard it is either "void *" or "caddr_t" (which is
+ * usually "char *" (signed or unsigned). If we cast it
+ * to "void *", those that have it caddr_t and an uptight
+ * C++ compiler, will freak out. But casting it as char*
+ * should work. Maybe. (Using Mmap_t figured out by
+ * Configure doesn't always work, apparently.) */
+ code = munmap((char*)m->mptr, m->len);
+ b->buf = NULL;
+ m->len = 0;
+ m->mptr = NULL;
+ if (PerlIO_seek(PerlIONext(f), b->posn, SEEK_SET) != 0)
+ code = -1;
+ }
+ b->ptr = b->end = b->buf;
+ PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
+ }
+ return code;
+}
+
+STDCHAR *
+PerlIOMmap_get_base(pTHX_ PerlIO *f)
+{
+ PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
+ PerlIOBuf * const b = &m->base;
+ if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
+ /*
+ * Already have a readbuffer in progress
+ */
+ return b->buf;
+ }
+ if (b->buf) {
+ /*
+ * We have a write buffer or flushed PerlIOBuf read buffer
+ */
+ m->bbuf = b->buf; /* save it in case we need it again */
+ b->buf = NULL; /* Clear to trigger below */
+ }
+ if (!b->buf) {
+ PerlIOMmap_map(aTHX_ f); /* Try and map it */
+ if (!b->buf) {
+ /*
+ * Map did not work - recover PerlIOBuf buffer if we have one
+ */
+ b->buf = m->bbuf;
+ }
+ }
+ b->ptr = b->end = b->buf;
+ if (b->buf)
+ return b->buf;
+ return PerlIOBuf_get_base(aTHX_ f);
+}
+
+SSize_t
+PerlIOMmap_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
+{
+ PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
+ PerlIOBuf * const b = &m->base;
+ if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
+ PerlIO_flush(f);
+ if (b->ptr && (b->ptr - count) >= b->buf
+ && memEQ(b->ptr - count, vbuf, count)) {
+ b->ptr -= count;
+ PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
+ return count;
+ }
+ if (m->len) {
+ /*
+ * Loose the unwritable mapped buffer
+ */
+ PerlIO_flush(f);
+ /*
+ * If flush took the "buffer" see if we have one from before
+ */
+ if (!b->buf && m->bbuf)
+ b->buf = m->bbuf;
+ if (!b->buf) {
+ PerlIOBuf_get_base(aTHX_ f);
+ m->bbuf = b->buf;
+ }
+ }
+ return PerlIOBuf_unread(aTHX_ f, vbuf, count);
+}
+
+SSize_t
+PerlIOMmap_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
+{
+ PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
+ PerlIOBuf * const b = &m->base;
+
+ if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
+ /*
+ * No, or wrong sort of, buffer
+ */
+ if (m->len) {
+ if (PerlIOMmap_unmap(aTHX_ f) != 0)
+ return 0;
+ }
+ /*
+ * If unmap took the "buffer" see if we have one from before
+ */
+ if (!b->buf && m->bbuf)
+ b->buf = m->bbuf;
+ if (!b->buf) {
+ PerlIOBuf_get_base(aTHX_ f);
+ m->bbuf = b->buf;
+ }
+ }
+ return PerlIOBuf_write(aTHX_ f, vbuf, count);
+}
+
+IV
+PerlIOMmap_flush(pTHX_ PerlIO *f)
+{
+ PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
+ PerlIOBuf * const b = &m->base;
+ IV code = PerlIOBuf_flush(aTHX_ f);
+ /*
+ * Now we are "synced" at PerlIOBuf level
+ */
+ if (b->buf) {
+ if (m->len) {
+ /*
+ * Unmap the buffer
+ */
+ if (PerlIOMmap_unmap(aTHX_ f) != 0)
+ code = -1;
+ }
+ else {
+ /*
+ * We seem to have a PerlIOBuf buffer which was not mapped
+ * remember it in case we need one later
+ */
+ m->bbuf = b->buf;
+ }
+ }
+ return code;
+}
+
+IV
+PerlIOMmap_fill(pTHX_ PerlIO *f)
+{
+ PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
+ IV code = PerlIO_flush(f);
+ if (code == 0 && !b->buf) {
+ code = PerlIOMmap_map(aTHX_ f);
+ }
+ if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
+ code = PerlIOBuf_fill(aTHX_ f);
+ }
+ return code;
+}
+
+IV
+PerlIOMmap_close(pTHX_ PerlIO *f)
+{
+ PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
+ PerlIOBuf * const b = &m->base;
+ IV code = PerlIO_flush(f);
+ if (m->bbuf) {
+ b->buf = m->bbuf;
+ m->bbuf = NULL;
+ b->ptr = b->end = b->buf;
+ }
+ if (PerlIOBuf_close(aTHX_ f) != 0)
+ code = -1;
+ return code;
+}
+
+PerlIO *
+PerlIOMmap_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
+{
+ return PerlIOBase_dup(aTHX_ f, o, param, flags);
+}
+
+
+PERLIO_FUNCS_DECL(PerlIO_mmap) = {
+ sizeof(PerlIO_funcs),
+ "mmap",
+ sizeof(PerlIOMmap),
+ PERLIO_K_BUFFERED|PERLIO_K_RAW,
+ PerlIOBuf_pushed,
+ PerlIOBuf_popped,
+ PerlIOBuf_open,
+ PerlIOBase_binmode, /* binmode */
+ NULL,
+ PerlIOBase_fileno,
+ PerlIOMmap_dup,
+ PerlIOBuf_read,
+ PerlIOMmap_unread,
+ PerlIOMmap_write,
+ PerlIOBuf_seek,
+ PerlIOBuf_tell,
+ PerlIOBuf_close,
+ PerlIOMmap_flush,
+ PerlIOMmap_fill,
+ PerlIOBase_eof,
+ PerlIOBase_error,
+ PerlIOBase_clearerr,
+ PerlIOBase_setlinebuf,
+ PerlIOMmap_get_base,
+ PerlIOBuf_bufsiz,
+ PerlIOBuf_get_ptr,
+ PerlIOBuf_get_cnt,
+ PerlIOBuf_set_ptrcnt,
+};
+
+#endif /* Layers available */
+
+MODULE = PerlIO::mmap PACKAGE = PerlIO::mmap
+
+PROTOTYPES: DISABLE
+
+BOOT:
+{
+#if defined(PERLIO_LAYERS) && defined(HAS_MMAP)
+ PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_mmap));
+#endif
+}
+
diff --git a/lib/.gitignore b/lib/.gitignore
index f74af56874..6550dffa52 100644
--- a/lib/.gitignore
+++ b/lib/.gitignore
@@ -310,6 +310,7 @@
/Parse/CPAN/
/Perl/OSType.pm
/PerlIO/encoding.pm
+/PerlIO/mmap.pm
/PerlIO/scalar.pm
/PerlIO/via.pm
/PerlIO/via/QuotedPrint.pm
diff --git a/lib/PerlIO.pm b/lib/PerlIO.pm
index 46e6e444ef..c94685bbf9 100644
--- a/lib/PerlIO.pm
+++ b/lib/PerlIO.pm
@@ -93,20 +93,6 @@ as being an end-of-file marker.
Based on the C<:perlio> layer.
-=item :mmap
-
-A layer which implements "reading" of files by using C<mmap()> to
-make a (whole) file appear in the process's address space, and then
-using that as PerlIO's "buffer". This I<may> be faster in certain
-circumstances for large files, and may result in less physical memory
-use when multiple processes are reading the same file.
-
-Files which are not C<mmap()>-able revert to behaving like the C<:perlio>
-layer. Writes also behave like the C<:perlio> layer, as C<mmap()> for write
-needs extra house-keeping (to extend the file) which negates any advantage.
-
-The C<:mmap> layer will not exist if the platform does not support C<mmap()>.
-
=item :utf8
Declares that the stream accepts perl's I<internal> encoding of
@@ -208,6 +194,20 @@ for example from Shift-JIS to Unicode. Note that under C<stdio>
an C<:encoding> also enables C<:utf8>. See L<PerlIO::encoding>
for more information.
+=item :mmap
+
+A layer which implements "reading" of files by using C<mmap()> to
+make a (whole) file appear in the process's address space, and then
+using that as PerlIO's "buffer". This I<may> be faster in certain
+circumstances for large files, and may result in less physical memory
+use when multiple processes are reading the same file.
+
+Files which are not C<mmap()>-able revert to behaving like the C<:perlio>
+layer. Writes also behave like the C<:perlio> layer, as C<mmap()> for write
+needs extra house-keeping (to extend the file) which negates any advantage.
+
+The C<:mmap> layer will not exist if the platform does not support C<mmap()>.
+
=item :via
Use C<:via(MODULE)> either in open() or binmode() to install a layer
@@ -284,7 +284,6 @@ DOS-like platforms and depending on the setting of C<$ENV{PERLIO}>:
unset / "" unix perlio / stdio [1] unix crlf
stdio unix perlio / stdio [1] stdio
perlio unix perlio unix perlio
- mmap unix mmap unix mmap
# [1] "stdio" if Configure found out how to do "fast stdio" (depends
# on the stdio implementation) and in Perl 5.8, otherwise "unix perlio"
diff --git a/perlio.c b/perlio.c
index a985dcc0e8..592a09450b 100644
--- a/perlio.c
+++ b/perlio.c
@@ -451,10 +451,6 @@ PerlIO_findFILE(PerlIO *pio)
#include "perliol.h"
-#ifdef HAS_MMAP
-#include <sys/mman.h>
-#endif
-
void
PerlIO_debug(const char *fmt, ...)
{
@@ -1179,9 +1175,6 @@ PerlIO_default_layers(pTHX)
PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_perlio));
PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_stdio));
PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_crlf));
-#ifdef HAS_MMAP
- PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_mmap));
-#endif
PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_utf8));
PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_remove));
PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_byte));
@@ -4826,297 +4819,6 @@ PERLIO_FUNCS_DECL(PerlIO_crlf) = {
PerlIOCrlf_set_ptrcnt,
};
-#ifdef HAS_MMAP
-/*--------------------------------------------------------------------------------------*/
-/*
- * mmap as "buffer" layer
- */
-
-typedef struct {
- PerlIOBuf base; /* PerlIOBuf stuff */
- Mmap_t mptr; /* Mapped address */
- Size_t len; /* mapped length */
- STDCHAR *bbuf; /* malloced buffer if map fails */
-} PerlIOMmap;
-
-IV
-PerlIOMmap_map(pTHX_ PerlIO *f)
-{
- dVAR;
- PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
- const IV flags = PerlIOBase(f)->flags;
- IV code = 0;
- if (m->len)
- abort();
- if (flags & PERLIO_F_CANREAD) {
- PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
- const int fd = PerlIO_fileno(f);
- Stat_t st;
- code = Fstat(fd, &st);
- if (code == 0 && S_ISREG(st.st_mode)) {
- SSize_t len = st.st_size - b->posn;
- if (len > 0) {
- Off_t posn;
- if (PL_mmap_page_size <= 0)
- Perl_croak(aTHX_ "panic: bad pagesize %" IVdf,
- PL_mmap_page_size);
- if (b->posn < 0) {
- /*
- * This is a hack - should never happen - open should
- * have set it !
- */
- b->posn = PerlIO_tell(PerlIONext(f));
- }
- posn = (b->posn / PL_mmap_page_size) * PL_mmap_page_size;
- len = st.st_size - posn;
- m->mptr = (Mmap_t)mmap(NULL, len, PROT_READ, MAP_SHARED, fd, posn);
- if (m->mptr && m->mptr != (Mmap_t) - 1) {
-#if 0 && defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
- madvise(m->mptr, len, MADV_SEQUENTIAL);
-#endif
-#if 0 && defined(HAS_MADVISE) && defined(MADV_WILLNEED)
- madvise(m->mptr, len, MADV_WILLNEED);
-#endif
- PerlIOBase(f)->flags =
- (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
- b->end = ((STDCHAR *) m->mptr) + len;
- b->buf = ((STDCHAR *) m->mptr) + (b->posn - posn);
- b->ptr = b->buf;
- m->len = len;
- }
- else {
- b->buf = NULL;
- }
- }
- else {
- PerlIOBase(f)->flags =
- flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
- b->buf = NULL;
- b->ptr = b->end = b->ptr;
- code = -1;
- }
- }
- }
- return code;
-}
-
-IV
-PerlIOMmap_unmap(pTHX_ PerlIO *f)
-{
- PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
- IV code = 0;
- if (m->len) {
- PerlIOBuf * const b = &m->base;
- if (b->buf) {
- /* The munmap address argument is tricky: depending on the
- * standard it is either "void *" or "caddr_t" (which is
- * usually "char *" (signed or unsigned). If we cast it
- * to "void *", those that have it caddr_t and an uptight
- * C++ compiler, will freak out. But casting it as char*
- * should work. Maybe. (Using Mmap_t figured out by
- * Configure doesn't always work, apparently.) */
- code = munmap((char*)m->mptr, m->len);
- b->buf = NULL;
- m->len = 0;
- m->mptr = NULL;
- if (PerlIO_seek(PerlIONext(f), b->posn, SEEK_SET) != 0)
- code = -1;
- }
- b->ptr = b->end = b->buf;
- PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
- }
- return code;
-}
-
-STDCHAR *
-PerlIOMmap_get_base(pTHX_ PerlIO *f)
-{
- PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
- PerlIOBuf * const b = &m->base;
- if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
- /*
- * Already have a readbuffer in progress
- */
- return b->buf;
- }
- if (b->buf) {
- /*
- * We have a write buffer or flushed PerlIOBuf read buffer
- */
- m->bbuf = b->buf; /* save it in case we need it again */
- b->buf = NULL; /* Clear to trigger below */
- }
- if (!b->buf) {
- PerlIOMmap_map(aTHX_ f); /* Try and map it */
- if (!b->buf) {
- /*
- * Map did not work - recover PerlIOBuf buffer if we have one
- */
- b->buf = m->bbuf;
- }
- }
- b->ptr = b->end = b->buf;
- if (b->buf)
- return b->buf;
- return PerlIOBuf_get_base(aTHX_ f);
-}
-
-SSize_t
-PerlIOMmap_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
-{
- PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
- PerlIOBuf * const b = &m->base;
- if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
- PerlIO_flush(f);
- if (b->ptr && (b->ptr - count) >= b->buf
- && memEQ(b->ptr - count, vbuf, count)) {
- b->ptr -= count;
- PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
- return count;
- }
- if (m->len) {
- /*
- * Loose the unwritable mapped buffer
- */
- PerlIO_flush(f);
- /*
- * If flush took the "buffer" see if we have one from before
- */
- if (!b->buf && m->bbuf)
- b->buf = m->bbuf;
- if (!b->buf) {
- PerlIOBuf_get_base(aTHX_ f);
- m->bbuf = b->buf;
- }
- }
- return PerlIOBuf_unread(aTHX_ f, vbuf, count);
-}
-
-SSize_t
-PerlIOMmap_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
-{
- PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
- PerlIOBuf * const b = &m->base;
-
- if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
- /*
- * No, or wrong sort of, buffer
- */
- if (m->len) {
- if (PerlIOMmap_unmap(aTHX_ f) != 0)
- return 0;
- }
- /*
- * If unmap took the "buffer" see if we have one from before
- */
- if (!b->buf && m->bbuf)
- b->buf = m->bbuf;
- if (!b->buf) {
- PerlIOBuf_get_base(aTHX_ f);
- m->bbuf = b->buf;
- }
- }
- return PerlIOBuf_write(aTHX_ f, vbuf, count);
-}
-
-IV
-PerlIOMmap_flush(pTHX_ PerlIO *f)
-{
- PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
- PerlIOBuf * const b = &m->base;
- IV code = PerlIOBuf_flush(aTHX_ f);
- /*
- * Now we are "synced" at PerlIOBuf level
- */
- if (b->buf) {
- if (m->len) {
- /*
- * Unmap the buffer
- */
- if (PerlIOMmap_unmap(aTHX_ f) != 0)
- code = -1;
- }
- else {
- /*
- * We seem to have a PerlIOBuf buffer which was not mapped
- * remember it in case we need one later
- */
- m->bbuf = b->buf;
- }
- }
- return code;
-}
-
-IV
-PerlIOMmap_fill(pTHX_ PerlIO *f)
-{
- PerlIOBuf * const b = PerlIOSelf(f, PerlIOBuf);
- IV code = PerlIO_flush(f);
- if (code == 0 && !b->buf) {
- code = PerlIOMmap_map(aTHX_ f);
- }
- if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
- code = PerlIOBuf_fill(aTHX_ f);
- }
- return code;
-}
-
-IV
-PerlIOMmap_close(pTHX_ PerlIO *f)
-{
- PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap);
- PerlIOBuf * const b = &m->base;
- IV code = PerlIO_flush(f);
- if (m->bbuf) {
- b->buf = m->bbuf;
- m->bbuf = NULL;
- b->ptr = b->end = b->buf;
- }
- if (PerlIOBuf_close(aTHX_ f) != 0)
- code = -1;
- return code;
-}
-
-PerlIO *
-PerlIOMmap_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
-{
- return PerlIOBase_dup(aTHX_ f, o, param, flags);
-}
-
-
-PERLIO_FUNCS_DECL(PerlIO_mmap) = {
- sizeof(PerlIO_funcs),
- "mmap",
- sizeof(PerlIOMmap),
- PERLIO_K_BUFFERED|PERLIO_K_RAW,
- PerlIOBuf_pushed,
- PerlIOBuf_popped,
- PerlIOBuf_open,
- PerlIOBase_binmode, /* binmode */
- NULL,
- PerlIOBase_fileno,
- PerlIOMmap_dup,
- PerlIOBuf_read,
- PerlIOMmap_unread,
- PerlIOMmap_write,
- PerlIOBuf_seek,
- PerlIOBuf_tell,
- PerlIOBuf_close,
- PerlIOMmap_flush,
- PerlIOMmap_fill,
- PerlIOBase_eof,
- PerlIOBase_error,
- PerlIOBase_clearerr,
- PerlIOBase_setlinebuf,
- PerlIOMmap_get_base,
- PerlIOBuf_bufsiz,
- PerlIOBuf_get_ptr,
- PerlIOBuf_get_cnt,
- PerlIOBuf_set_ptrcnt,
-};
-
-#endif /* HAS_MMAP */
-
PerlIO *
Perl_PerlIO_stdin(pTHX)
{
diff --git a/perliol.h b/perliol.h
index a51f99b903..3bce866f49 100644
--- a/perliol.h
+++ b/perliol.h
@@ -113,9 +113,6 @@ EXTPERLIO PerlIO_funcs PerlIO_utf8;
EXTPERLIO PerlIO_funcs PerlIO_byte;
EXTPERLIO PerlIO_funcs PerlIO_raw;
EXTPERLIO PerlIO_funcs PerlIO_pending;
-#ifdef HAS_MMAP
-EXTPERLIO PerlIO_funcs PerlIO_mmap;
-#endif
#ifdef WIN32
EXTPERLIO PerlIO_funcs PerlIO_win32;
#endif
@@ -223,17 +220,6 @@ PERL_EXPORT_C SSize_t PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Siz
PERL_EXPORT_C SSize_t PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
PERL_EXPORT_C SSize_t PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
-/* Mmap */
-PERL_EXPORT_C IV PerlIOMmap_close(pTHX_ PerlIO *f);
-PERL_EXPORT_C PerlIO * PerlIOMmap_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags);
-PERL_EXPORT_C IV PerlIOMmap_fill(pTHX_ PerlIO *f);
-PERL_EXPORT_C IV PerlIOMmap_flush(pTHX_ PerlIO *f);
-PERL_EXPORT_C STDCHAR * PerlIOMmap_get_base(pTHX_ PerlIO *f);
-PERL_EXPORT_C IV PerlIOMmap_map(pTHX_ PerlIO *f);
-PERL_EXPORT_C IV PerlIOMmap_unmap(pTHX_ PerlIO *f);
-PERL_EXPORT_C SSize_t PerlIOMmap_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
-PERL_EXPORT_C SSize_t PerlIOMmap_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
-
/* Pending */
PERL_EXPORT_C IV PerlIOPending_close(pTHX_ PerlIO *f);
PERL_EXPORT_C IV PerlIOPending_fill(pTHX_ PerlIO *f);