1.1 --- a/accessor.cc Thu Mar 18 00:59:55 2021 +0100
1.2 +++ b/accessor.cc Fri Mar 19 00:28:31 2021 +0100
1.3 @@ -1,5 +1,9 @@
1.4 #include "accessor.h"
1.5
1.6 +#include <string.h>
1.7 +
1.8 +
1.9 +
1.10 Accessor::Accessor(fileid_t fileid, offset_t size)
1.11 : _size(size), fileid(fileid)
1.12 {
1.13 @@ -31,4 +35,37 @@
1.14 {
1.15 }
1.16
1.17 +/* Data transfer methods. */
1.18 +
1.19 +void Accessor::fill(Flexpage *flexpage)
1.20 +{
1.21 + /* Filling completely beyond the end of file should produce an empty
1.22 + flexpage. This could potentially be a shared read-only flexpage that
1.23 + would be replaced by an independent writable flexpage if ever written. */
1.24 +
1.25 + if (flexpage->base_offset < _size)
1.26 + fill_populated(flexpage);
1.27 + else
1.28 + memset((void *) flexpage->base_addr, 0, flexpage->size);
1.29 +}
1.30 +
1.31 +void Accessor::flush(Flexpage *flexpage)
1.32 +{
1.33 + /* Flushing completely beyond the end of file should discard the
1.34 + flexpage. */
1.35 +
1.36 + if (flexpage->base_offset < _size)
1.37 + flush_populated(flexpage);
1.38 +}
1.39 +
1.40 +/* Data transfer helper methods. */
1.41 +
1.42 +void Accessor::fill_populated(Flexpage *flexpage)
1.43 +{
1.44 +}
1.45 +
1.46 +void Accessor::flush_populated(Flexpage *flexpage)
1.47 +{
1.48 +}
1.49 +
1.50 // vim: tabstop=4 expandtab shiftwidth=4
2.1 --- a/accessor.h Thu Mar 18 00:59:55 2021 +0100
2.2 +++ b/accessor.h Fri Mar 19 00:28:31 2021 +0100
2.3 @@ -9,6 +9,12 @@
2.4 protected:
2.5 offset_t _size;
2.6
2.7 + /* Data transfer helper methods. */
2.8 +
2.9 + virtual void fill_populated(Flexpage *flexpage);
2.10 +
2.11 + virtual void flush_populated(Flexpage *flexpage);
2.12 +
2.13 public:
2.14 fileid_t fileid;
2.15
2.16 @@ -24,9 +30,9 @@
2.17
2.18 /* Data transfer methods. */
2.19
2.20 - virtual void fill(Flexpage *flexpage) = 0;
2.21 + virtual void fill(Flexpage *flexpage);
2.22
2.23 - virtual void flush(Flexpage *flexpage) = 0;
2.24 + virtual void flush(Flexpage *flexpage);
2.25 };
2.26
2.27 // vim: tabstop=4 expandtab shiftwidth=4
3.1 --- a/files/block_file_accessor.cc Thu Mar 18 00:59:55 2021 +0100
3.2 +++ b/files/block_file_accessor.cc Fri Mar 19 00:28:31 2021 +0100
3.3 @@ -62,27 +62,15 @@
3.4 }
3.5 }
3.6
3.7 -/* Data transfer methods. */
3.8 +/* Data transfer helper methods. */
3.9
3.10 -void BlockFileAccessor::fill(Flexpage *flexpage)
3.11 +/* Fill the populated portion of a flexpage. */
3.12 +
3.13 +void BlockFileAccessor::fill_populated(Flexpage *flexpage)
3.14 {
3.15 offset_t filepos = flexpage->base_offset;
3.16 offset_t addr = flexpage->base_addr;
3.17 - offset_t populated_size;
3.18 -
3.19 - /* Filling completely beyond the end of file should produce an empty
3.20 - flexpage. This could potentially be a shared read-only flexpage that
3.21 - would be replaced by an independent writable flexpage if ever written. */
3.22 -
3.23 - if (filepos > _size)
3.24 - {
3.25 - memset((void *) addr, 0, flexpage->size);
3.26 - return;
3.27 - }
3.28 -
3.29 - /* Otherwise, fill the populated portion of a flexpage. */
3.30 -
3.31 - populated_size = std::min(flexpage->size, _size - filepos);
3.32 + offset_t populated_size = std::min(flexpage->size, _size - filepos);
3.33
3.34 /* Tag the region with file state. */
3.35
3.36 @@ -98,21 +86,13 @@
3.37 memset((void *) (addr + populated_size), 0, flexpage->size - populated_size);
3.38 }
3.39
3.40 -void BlockFileAccessor::flush(Flexpage *flexpage)
3.41 -{
3.42 - offset_t addr = flexpage->base_addr;
3.43 - offset_t filepos = flexpage->base_offset;
3.44 - offset_t populated_size;
3.45 +/* Flush the populated portion of a flexpage. */
3.46
3.47 - /* Flushing completely beyond the end of file should discard the
3.48 - flexpage. */
3.49 -
3.50 - if (filepos > _size)
3.51 - return;
3.52 -
3.53 - /* Otherwise, only the populated portion of a flexpage should be flushed. */
3.54 -
3.55 - populated_size = std::min(flexpage->size, _size - filepos);
3.56 +void BlockFileAccessor::flush_populated(Flexpage *flexpage)
3.57 +{
3.58 + offset_t filepos = flexpage->base_offset;
3.59 + offset_t addr = flexpage->base_addr;
3.60 + offset_t populated_size = std::min(flexpage->size, _size - filepos);
3.61
3.62 /* Remove the file state tag from the region. */
3.63
4.1 --- a/files/block_file_accessor.h Thu Mar 18 00:59:55 2021 +0100
4.2 +++ b/files/block_file_accessor.h Fri Mar 19 00:28:31 2021 +0100
4.3 @@ -10,16 +10,16 @@
4.4 protected:
4.5 char *_data;
4.6
4.7 + /* Data transfer helper methods. */
4.8 +
4.9 + virtual void fill_populated(Flexpage *flexpage);
4.10 +
4.11 + virtual void flush_populated(Flexpage *flexpage);
4.12 +
4.13 public:
4.14 explicit BlockFileAccessor(const char *path, fileid_t fileid);
4.15
4.16 virtual void set_size(offset_t size);
4.17 -
4.18 - /* Data transfer methods. */
4.19 -
4.20 - virtual void fill(Flexpage *flexpage);
4.21 -
4.22 - virtual void flush(Flexpage *flexpage);
4.23 };
4.24
4.25 // vim: tabstop=4 expandtab shiftwidth=4
5.1 --- a/files/host_file_accessor.cc Thu Mar 18 00:59:55 2021 +0100
5.2 +++ b/files/host_file_accessor.cc Fri Mar 19 00:28:31 2021 +0100
5.3 @@ -32,13 +32,14 @@
5.4 _fp = fopen(_path, "r");
5.5 }
5.6
5.7 -/* Data transfer methods. */
5.8 +/* Data transfer helper methods. */
5.9
5.10 -void HostFileAccessor::fill(Flexpage *flexpage)
5.11 +void HostFileAccessor::fill_populated(Flexpage *flexpage)
5.12 {
5.13 - /* Obtain the offset and seek in the file. */
5.14 + offset_t filepos = flexpage->base_offset;
5.15 + offset_t addr = flexpage->base_addr;
5.16
5.17 - offset_t filepos = flexpage->base_offset;
5.18 + /* Seek to the offset in the file. */
5.19
5.20 fseek(_fp, filepos, SEEK_SET);
5.21
5.22 @@ -48,8 +49,6 @@
5.23
5.24 /* Fill the region with file content. */
5.25
5.26 - offset_t addr = flexpage->base_addr;
5.27 -
5.28 size_t nread = fread((void *) addr, sizeof(char), flexpage->size, _fp);
5.29
5.30 /* Pad the flexpage with zero. */
5.31 @@ -57,11 +56,8 @@
5.32 memset((void *) (addr + nread), 0, flexpage->size - nread);
5.33 }
5.34
5.35 -void HostFileAccessor::flush(Flexpage *flexpage)
5.36 +void HostFileAccessor::flush_populated(Flexpage *flexpage)
5.37 {
5.38 - /* NOTE: A real flush operation would store the memory content and update
5.39 - the file size, if appropriate. */
5.40 -
5.41 flexpage->region->flush();
5.42 }
5.43
6.1 --- a/files/host_file_accessor.h Thu Mar 18 00:59:55 2021 +0100
6.2 +++ b/files/host_file_accessor.h Fri Mar 19 00:28:31 2021 +0100
6.3 @@ -13,18 +13,18 @@
6.4 const char *_path;
6.5 FILE *_fp;
6.6
6.7 + /* Data transfer helper methods. */
6.8 +
6.9 + virtual void fill_populated(Flexpage *flexpage);
6.10 +
6.11 + virtual void flush_populated(Flexpage *flexpage);
6.12 +
6.13 public:
6.14 explicit HostFileAccessor(const char *path, fileid_t fileid);
6.15
6.16 virtual void close();
6.17
6.18 virtual void open();
6.19 -
6.20 - /* Data transfer methods. */
6.21 -
6.22 - virtual void fill(Flexpage *flexpage);
6.23 -
6.24 - virtual void flush(Flexpage *flexpage);
6.25 };
6.26
6.27 // vim: tabstop=4 expandtab shiftwidth=4
7.1 --- a/files/test_file_accessor.cc Thu Mar 18 00:59:55 2021 +0100
7.2 +++ b/files/test_file_accessor.cc Fri Mar 19 00:28:31 2021 +0100
7.3 @@ -8,9 +8,9 @@
7.4 {
7.5 }
7.6
7.7 -/* Data transfer methods. */
7.8 +/* Data transfer helper methods. */
7.9
7.10 -void TestFileAccessor::fill(Flexpage *flexpage)
7.11 +void TestFileAccessor::fill_populated(Flexpage *flexpage)
7.12 {
7.13 Region *region = flexpage->region;
7.14 offset_t filepos = flexpage->base_offset;
7.15 @@ -43,11 +43,8 @@
7.16 }
7.17 }
7.18
7.19 -void TestFileAccessor::flush(Flexpage *flexpage)
7.20 +void TestFileAccessor::flush_populated(Flexpage *flexpage)
7.21 {
7.22 - /* NOTE: Flushing would not necessarily blank the region as this does.
7.23 - Also, a real flush operation would store the memory content. */
7.24 -
7.25 flexpage->region->flush();
7.26 }
7.27
8.1 --- a/files/test_file_accessor.h Thu Mar 18 00:59:55 2021 +0100
8.2 +++ b/files/test_file_accessor.h Fri Mar 19 00:28:31 2021 +0100
8.3 @@ -6,14 +6,16 @@
8.4
8.5 class TestFileAccessor : public Accessor
8.6 {
8.7 +protected:
8.8 +
8.9 + /* Data transfer helper methods. */
8.10 +
8.11 + virtual void fill_populated(Flexpage *flexpage);
8.12 +
8.13 + virtual void flush_populated(Flexpage *flexpage);
8.14 +
8.15 public:
8.16 explicit TestFileAccessor(fileid_t fileid, offset_t size=0);
8.17 -
8.18 - /* Data transfer methods. */
8.19 -
8.20 - virtual void fill(Flexpage *flexpage);
8.21 -
8.22 - virtual void flush(Flexpage *flexpage);
8.23 };
8.24
8.25 // vim: tabstop=4 expandtab shiftwidth=4