Skip to content

Commit

Permalink
Fix 24339 - std.mmfile has poor documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
dkorpel authored and dlang-bot committed Jan 14, 2024
1 parent fa7f22b commit fc804bb
Showing 1 changed file with 50 additions and 16 deletions.
66 changes: 50 additions & 16 deletions std/mmfile.d
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,22 @@

/**
* Read and write memory mapped files.
*
* Memory mapped files are a mechanism in operating systems that allows
* file access through virtual memory. After opening a file with `MmFile`,
* the contents can be read from or written to with standard slice / pointer operations.
* Changes to the memory are automatically reflected in the underlying file.
*
* Memory mapping can increase I/O performance of large files, compared to buffered
* read / write operations from `std.file` and `std.stdio`. However, I/O errors are
* not handled as safely: when for example the disk that the file is on gets removed,
* reading from it may result in a segfault.
*
* Copyright: Copyright The D Language Foundation 2004 - 2009.
* License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
* Authors: $(HTTP digitalmars.com, Walter Bright),
* Matthew Wilson
* References: $(LINK https://en.wikipedia.org/wiki/Memory-mapped_file)
* Source: $(PHOBOSSRC std/mmfile.d)
*
* $(SCRIPT inhibitQuickIndex = 1;)
Expand Down Expand Up @@ -612,23 +624,45 @@ private:
{
static assert(0);
}
}

/// Read an existing file
@system unittest
{
import std.file;
std.file.write(deleteme, "hello"); // deleteme is a temporary filename
scope(exit) remove(deleteme);

// Use a scope class so the file will be closed at the end of this function
scope mmfile = new MmFile(deleteme);

assert(mmfile.length == "hello".length);

// Access file contents with the slice operator
// This is typed as `void[]`, so cast to `char[]` or `ubyte[]` to use it
const data = cast(const(char)[]) mmfile[];

// At this point, the file content hasn't been read yet.
// The OS will
assert(data[0 .. 5] == "hello");
}

/// Write a new file
@system unittest
{
import std.file;
scope(exit) remove(deleteme);

scope mmfile = new MmFile(deleteme, MmFile.Mode.readWriteNew, 5, null);
assert(mmfile.length == 5);

// Assign through operator overload of `MmFile`
auto data = cast(ubyte[]) mmfile[];
data[] = '\n';

mmfile.flush();

// Report error, where errno gives the error number
// void errNo()
// {
// version (Windows)
// {
// throw new FileException(filename, GetLastError());
// }
// else version (linux)
// {
// throw new FileException(filename, errno);
// }
// else
// {
// static assert(0);
// }
// }
assert(std.file.read(deleteme) == "\n\n\n\n\n");
}

@system unittest
Expand Down

0 comments on commit fc804bb

Please sign in to comment.