1.1 --- a/Makefile Tue Mar 16 23:55:32 2021 +0100
1.2 +++ b/Makefile Tue Mar 16 23:59:07 2021 +0100
1.3 @@ -19,7 +19,7 @@
1.4 # Compound interfaces.
1.5
1.6 mapped_file_object_NAME = MappedFileObject
1.7 -mapped_file_object_INTERFACES = dataspace mapped_file
1.8 +mapped_file_object_INTERFACES = dataspace file mapped_file
1.9
1.10 opener_context_object_NAME = OpenerContextObject
1.11 opener_context_object_INTERFACES = dataspace opener_context
1.12 @@ -28,7 +28,7 @@
1.13
1.14 # Individual interfaces.
1.15
1.16 -CLIENT_INTERFACES_CC = dataspace mapped_file opener opener_context
1.17 +CLIENT_INTERFACES_CC = dataspace file mapped_file opener opener_context
1.18
1.19 SERVER_INTERFACES_CC = opener $(call common_interfaces,$(COMP_INTERFACES_CC))
1.20
2.1 --- a/accessor.cc Tue Mar 16 23:55:32 2021 +0100
2.2 +++ b/accessor.cc Tue Mar 16 23:59:07 2021 +0100
2.3 @@ -12,6 +12,13 @@
2.4 return _size;
2.5 }
2.6
2.7 +/* Update the size of the file. */
2.8 +
2.9 +void Accessor::set_size(offset_t size)
2.10 +{
2.11 + _size = size;
2.12 +}
2.13 +
2.14 /* Perform any closing operation on the file. */
2.15
2.16 void Accessor::close()
3.1 --- a/accessor.h Tue Mar 16 23:55:32 2021 +0100
3.2 +++ b/accessor.h Tue Mar 16 23:59:07 2021 +0100
3.3 @@ -16,6 +16,8 @@
3.4
3.5 virtual offset_t get_size();
3.6
3.7 + virtual void set_size(offset_t size);
3.8 +
3.9 virtual void close();
3.10
3.11 virtual void open();
4.1 --- a/file_pager.cc Tue Mar 16 23:55:32 2021 +0100
4.2 +++ b/file_pager.cc Tue Mar 16 23:59:07 2021 +0100
4.3 @@ -19,6 +19,11 @@
4.4 return (ipc_server_handler_type) handle_MappedFileObject;
4.5 }
4.6
4.7 +long FilePager::flush(offset_t populated_size, offset_t *size)
4.8 +{
4.9 + return Pager::flush(populated_size, size);
4.10 +}
4.11 +
4.12 long FilePager::mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end)
4.13 {
4.14 /* Set the limits of the paged region. */
5.1 --- a/file_pager.h Tue Mar 16 23:55:32 2021 +0100
5.2 +++ b/file_pager.h Tue Mar 16 23:59:07 2021 +0100
5.3 @@ -21,6 +21,10 @@
5.4 void *interface()
5.5 { return static_cast<MappedFileObject *>(this); }
5.6
5.7 + /* File methods. */
5.8 +
5.9 + virtual long flush(offset_t populated_size, offset_t *size);
5.10 +
5.11 /* Pager and mapped file methods. */
5.12
5.13 virtual long map(unsigned long offset, l4_addr_t hot_spot, flags_t flags, l4_snd_fpage_t *region);
6.1 --- a/page_mapper.cc Tue Mar 16 23:55:32 2021 +0100
6.2 +++ b/page_mapper.cc Tue Mar 16 23:59:07 2021 +0100
6.3 @@ -97,6 +97,13 @@
6.4 return _accessor->get_size();
6.5 }
6.6
6.7 +/* Set the maximum extent of the mapped resource. */
6.8 +
6.9 +void PageMapper::set_data_size(offset_t size)
6.10 +{
6.11 + _accessor->set_size(size);
6.12 +}
6.13 +
6.14 /* Internal flexpage retrieval methods. */
6.15
6.16 /* Find an existing flexpage for 'offset'. Where the accessor has registered a
7.1 --- a/page_mapper.h Tue Mar 16 23:55:32 2021 +0100
7.2 +++ b/page_mapper.h Tue Mar 16 23:59:07 2021 +0100
7.3 @@ -42,6 +42,8 @@
7.4
7.5 offset_t get_data_size();
7.6
7.7 + void set_data_size(offset_t size);
7.8 +
7.9 /* Data transfer methods, implementing PageOwner. */
7.10
7.11 void fill(Flexpage *flexpage);
8.1 --- a/pager.cc Tue Mar 16 23:55:32 2021 +0100
8.2 +++ b/pager.cc Tue Mar 16 23:59:07 2021 +0100
8.3 @@ -15,6 +15,26 @@
8.4 _mapper->detach();
8.5 }
8.6
8.7 +/* Flush data to the file. */
8.8 +
8.9 +long Pager::flush(offset_t populated_size, offset_t *size)
8.10 +{
8.11 + offset_t limit = _start + populated_size;
8.12 + offset_t file_size = _mapper->get_data_size();
8.13 +
8.14 + /* Extend the file if the populated size of the region goes beyond the
8.15 + current size. */
8.16 +
8.17 + if (limit > file_size)
8.18 + {
8.19 + file_size = limit;
8.20 + _mapper->set_data_size(file_size);
8.21 + }
8.22 +
8.23 + *size = file_size;
8.24 + return L4_EOK;
8.25 +}
8.26 +
8.27 /* Expose a region of the file. */
8.28
8.29 long Pager::mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end)
9.1 --- a/pager.h Tue Mar 16 23:55:32 2021 +0100
9.2 +++ b/pager.h Tue Mar 16 23:59:07 2021 +0100
9.3 @@ -29,6 +29,10 @@
9.4
9.5 offset_t get_data_size();
9.6
9.7 + /* File methods. */
9.8 +
9.9 + virtual long flush(offset_t populated_size, offset_t *size);
9.10 +
9.11 /* Mapped file methods. */
9.12
9.13 virtual long mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end);