1.1 --- a/libfsserver/lib/pipes/pipe_pager.cc Fri May 10 14:49:52 2024 +0200
1.2 +++ b/libfsserver/lib/pipes/pipe_pager.cc Fri May 10 19:00:38 2024 +0200
1.3 @@ -36,6 +36,10 @@
1.4
1.5 _size = _paging->region_size();
1.6
1.7 + /* Initialise any recorded position in the region. */
1.8 +
1.9 + _data_current = 0;
1.10 +
1.11 /* Obtain any initial page mapper, this having been set up in the paging
1.12 coordinator. */
1.13
1.14 @@ -92,10 +96,13 @@
1.15
1.16 /* Return details of the current region. */
1.17
1.18 -long PipePager::current_region(offset_t *populated_size, offset_t *size)
1.19 +long PipePager::current_region(offset_t *position, offset_t *populated_size, offset_t *size)
1.20 {
1.21 if (_mapper != NULL)
1.22 {
1.23 + if (position != NULL)
1.24 + *position = _data_current;
1.25 +
1.26 *populated_size = _mapper->get_data_size();
1.27 *size = _size;
1.28 return L4_EOK;
1.29 @@ -124,8 +131,9 @@
1.30 return pipe_error();
1.31
1.32 _mapper = mapper;
1.33 + _data_current = 0;
1.34
1.35 - return current_region(populated_size, size);
1.36 + return current_region(NULL, populated_size, size);
1.37 }
1.38
1.39 long PipePager::next_region_for_writer(offset_t *populated_size, offset_t *size)
1.40 @@ -143,8 +151,9 @@
1.41 return pipe_error();
1.42
1.43 _mapper = mapper;
1.44 + _data_current = 0;
1.45
1.46 - return current_region(populated_size, size);
1.47 + return current_region(NULL, populated_size, size);
1.48 }
1.49
1.50 long PipePager::pipe_error()
1.51 @@ -157,12 +166,19 @@
1.52
1.53
1.54
1.55 -/* Update the populated size of a pipe region and notify the other endpoint. */
1.56 +/* Update the consumed or populated size of a pipe region and notify the other
1.57 + endpoint. The consumed size is recorded to allow pipes to be shared between
1.58 + programs. */
1.59
1.60 -long PipePager::flush(offset_t populated_size, offset_t *size)
1.61 +long PipePager::flush(offset_t position, offset_t *size)
1.62 {
1.63 - if (_writing && (_mapper != NULL))
1.64 - _mapper->set_data_size(populated_size);
1.65 + if (_mapper != NULL)
1.66 + {
1.67 + _data_current = position;
1.68 +
1.69 + if (_writing)
1.70 + _mapper->set_data_size(position);
1.71 + }
1.72
1.73 *size = _size;
1.74