# HG changeset patch # User Paul Boddie # Date 1616110111 -3600 # Node ID 256810aa88c49a8d39ef0ccaecfcffee7f15ba44 # Parent 0073e2ca6c75cf24c2093d5624deb2da4f63c67b Introduced common functionality for accessors, with methods for filling and flushing populated regions of flexpages being invoked from the common fill and flush methods. diff -r 0073e2ca6c75 -r 256810aa88c4 accessor.cc --- a/accessor.cc Thu Mar 18 00:59:55 2021 +0100 +++ b/accessor.cc Fri Mar 19 00:28:31 2021 +0100 @@ -1,5 +1,9 @@ #include "accessor.h" +#include + + + Accessor::Accessor(fileid_t fileid, offset_t size) : _size(size), fileid(fileid) { @@ -31,4 +35,37 @@ { } +/* Data transfer methods. */ + +void Accessor::fill(Flexpage *flexpage) +{ + /* Filling completely beyond the end of file should produce an empty + flexpage. This could potentially be a shared read-only flexpage that + would be replaced by an independent writable flexpage if ever written. */ + + if (flexpage->base_offset < _size) + fill_populated(flexpage); + else + memset((void *) flexpage->base_addr, 0, flexpage->size); +} + +void Accessor::flush(Flexpage *flexpage) +{ + /* Flushing completely beyond the end of file should discard the + flexpage. */ + + if (flexpage->base_offset < _size) + flush_populated(flexpage); +} + +/* Data transfer helper methods. */ + +void Accessor::fill_populated(Flexpage *flexpage) +{ +} + +void Accessor::flush_populated(Flexpage *flexpage) +{ +} + // vim: tabstop=4 expandtab shiftwidth=4 diff -r 0073e2ca6c75 -r 256810aa88c4 accessor.h --- a/accessor.h Thu Mar 18 00:59:55 2021 +0100 +++ b/accessor.h Fri Mar 19 00:28:31 2021 +0100 @@ -9,6 +9,12 @@ protected: offset_t _size; + /* Data transfer helper methods. */ + + virtual void fill_populated(Flexpage *flexpage); + + virtual void flush_populated(Flexpage *flexpage); + public: fileid_t fileid; @@ -24,9 +30,9 @@ /* Data transfer methods. */ - virtual void fill(Flexpage *flexpage) = 0; + virtual void fill(Flexpage *flexpage); - virtual void flush(Flexpage *flexpage) = 0; + virtual void flush(Flexpage *flexpage); }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r 0073e2ca6c75 -r 256810aa88c4 files/block_file_accessor.cc --- a/files/block_file_accessor.cc Thu Mar 18 00:59:55 2021 +0100 +++ b/files/block_file_accessor.cc Fri Mar 19 00:28:31 2021 +0100 @@ -62,27 +62,15 @@ } } -/* Data transfer methods. */ +/* Data transfer helper methods. */ -void BlockFileAccessor::fill(Flexpage *flexpage) +/* Fill the populated portion of a flexpage. */ + +void BlockFileAccessor::fill_populated(Flexpage *flexpage) { offset_t filepos = flexpage->base_offset; offset_t addr = flexpage->base_addr; - offset_t populated_size; - - /* Filling completely beyond the end of file should produce an empty - flexpage. This could potentially be a shared read-only flexpage that - would be replaced by an independent writable flexpage if ever written. */ - - if (filepos > _size) - { - memset((void *) addr, 0, flexpage->size); - return; - } - - /* Otherwise, fill the populated portion of a flexpage. */ - - populated_size = std::min(flexpage->size, _size - filepos); + offset_t populated_size = std::min(flexpage->size, _size - filepos); /* Tag the region with file state. */ @@ -98,21 +86,13 @@ memset((void *) (addr + populated_size), 0, flexpage->size - populated_size); } -void BlockFileAccessor::flush(Flexpage *flexpage) -{ - offset_t addr = flexpage->base_addr; - offset_t filepos = flexpage->base_offset; - offset_t populated_size; +/* Flush the populated portion of a flexpage. */ - /* Flushing completely beyond the end of file should discard the - flexpage. */ - - if (filepos > _size) - return; - - /* Otherwise, only the populated portion of a flexpage should be flushed. */ - - populated_size = std::min(flexpage->size, _size - filepos); +void BlockFileAccessor::flush_populated(Flexpage *flexpage) +{ + offset_t filepos = flexpage->base_offset; + offset_t addr = flexpage->base_addr; + offset_t populated_size = std::min(flexpage->size, _size - filepos); /* Remove the file state tag from the region. */ diff -r 0073e2ca6c75 -r 256810aa88c4 files/block_file_accessor.h --- a/files/block_file_accessor.h Thu Mar 18 00:59:55 2021 +0100 +++ b/files/block_file_accessor.h Fri Mar 19 00:28:31 2021 +0100 @@ -10,16 +10,16 @@ protected: char *_data; + /* Data transfer helper methods. */ + + virtual void fill_populated(Flexpage *flexpage); + + virtual void flush_populated(Flexpage *flexpage); + public: explicit BlockFileAccessor(const char *path, fileid_t fileid); virtual void set_size(offset_t size); - - /* Data transfer methods. */ - - virtual void fill(Flexpage *flexpage); - - virtual void flush(Flexpage *flexpage); }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r 0073e2ca6c75 -r 256810aa88c4 files/host_file_accessor.cc --- a/files/host_file_accessor.cc Thu Mar 18 00:59:55 2021 +0100 +++ b/files/host_file_accessor.cc Fri Mar 19 00:28:31 2021 +0100 @@ -32,13 +32,14 @@ _fp = fopen(_path, "r"); } -/* Data transfer methods. */ +/* Data transfer helper methods. */ -void HostFileAccessor::fill(Flexpage *flexpage) +void HostFileAccessor::fill_populated(Flexpage *flexpage) { - /* Obtain the offset and seek in the file. */ + offset_t filepos = flexpage->base_offset; + offset_t addr = flexpage->base_addr; - offset_t filepos = flexpage->base_offset; + /* Seek to the offset in the file. */ fseek(_fp, filepos, SEEK_SET); @@ -48,8 +49,6 @@ /* Fill the region with file content. */ - offset_t addr = flexpage->base_addr; - size_t nread = fread((void *) addr, sizeof(char), flexpage->size, _fp); /* Pad the flexpage with zero. */ @@ -57,11 +56,8 @@ memset((void *) (addr + nread), 0, flexpage->size - nread); } -void HostFileAccessor::flush(Flexpage *flexpage) +void HostFileAccessor::flush_populated(Flexpage *flexpage) { - /* NOTE: A real flush operation would store the memory content and update - the file size, if appropriate. */ - flexpage->region->flush(); } diff -r 0073e2ca6c75 -r 256810aa88c4 files/host_file_accessor.h --- a/files/host_file_accessor.h Thu Mar 18 00:59:55 2021 +0100 +++ b/files/host_file_accessor.h Fri Mar 19 00:28:31 2021 +0100 @@ -13,18 +13,18 @@ const char *_path; FILE *_fp; + /* Data transfer helper methods. */ + + virtual void fill_populated(Flexpage *flexpage); + + virtual void flush_populated(Flexpage *flexpage); + public: explicit HostFileAccessor(const char *path, fileid_t fileid); virtual void close(); virtual void open(); - - /* Data transfer methods. */ - - virtual void fill(Flexpage *flexpage); - - virtual void flush(Flexpage *flexpage); }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r 0073e2ca6c75 -r 256810aa88c4 files/test_file_accessor.cc --- a/files/test_file_accessor.cc Thu Mar 18 00:59:55 2021 +0100 +++ b/files/test_file_accessor.cc Fri Mar 19 00:28:31 2021 +0100 @@ -8,9 +8,9 @@ { } -/* Data transfer methods. */ +/* Data transfer helper methods. */ -void TestFileAccessor::fill(Flexpage *flexpage) +void TestFileAccessor::fill_populated(Flexpage *flexpage) { Region *region = flexpage->region; offset_t filepos = flexpage->base_offset; @@ -43,11 +43,8 @@ } } -void TestFileAccessor::flush(Flexpage *flexpage) +void TestFileAccessor::flush_populated(Flexpage *flexpage) { - /* NOTE: Flushing would not necessarily blank the region as this does. - Also, a real flush operation would store the memory content. */ - flexpage->region->flush(); } diff -r 0073e2ca6c75 -r 256810aa88c4 files/test_file_accessor.h --- a/files/test_file_accessor.h Thu Mar 18 00:59:55 2021 +0100 +++ b/files/test_file_accessor.h Fri Mar 19 00:28:31 2021 +0100 @@ -6,14 +6,16 @@ class TestFileAccessor : public Accessor { +protected: + + /* Data transfer helper methods. */ + + virtual void fill_populated(Flexpage *flexpage); + + virtual void flush_populated(Flexpage *flexpage); + public: explicit TestFileAccessor(fileid_t fileid, offset_t size=0); - - /* Data transfer methods. */ - - virtual void fill(Flexpage *flexpage); - - virtual void flush(Flexpage *flexpage); }; // vim: tabstop=4 expandtab shiftwidth=4