1.1 --- a/libfsserver/include/fsserver/pipe_pager.h Wed May 05 00:09:11 2021 +0200
1.2 +++ b/libfsserver/include/fsserver/pipe_pager.h Fri May 07 00:31:02 2021 +0200
1.3 @@ -42,6 +42,8 @@
1.4
1.5 virtual long next_region_for_writer(offset_t *populated_size, offset_t *size);
1.6
1.7 + virtual long pipe_error();
1.8 +
1.9 public:
1.10 explicit PipePager(PipePaging *paging, bool writer);
1.11
2.1 --- a/libfsserver/include/fsserver/pipe_paging.h Wed May 05 00:09:11 2021 +0200
2.2 +++ b/libfsserver/include/fsserver/pipe_paging.h Fri May 07 00:31:02 2021 +0200
2.3 @@ -69,6 +69,10 @@
2.4 virtual PageMapper *current_region();
2.5
2.6 virtual PageMapper *next_region();
2.7 +
2.8 + /* Access management. */
2.9 +
2.10 + virtual int closed();
2.11 };
2.12
2.13 // vim: tabstop=4 expandtab shiftwidth=4
3.1 --- a/libfsserver/lib/pipes/pipe_pager.cc Wed May 05 00:09:11 2021 +0200
3.2 +++ b/libfsserver/lib/pipes/pipe_pager.cc Fri May 07 00:31:02 2021 +0200
3.3 @@ -77,7 +77,7 @@
3.4 return L4_EOK;
3.5 }
3.6 else
3.7 - return -L4_EIO;
3.8 + return pipe_error();
3.9 }
3.10
3.11 /* Obtain the next region and its details. */
3.12 @@ -97,7 +97,7 @@
3.13 PageMapper *mapper = _paging->next_region();
3.14
3.15 if (mapper == NULL)
3.16 - return -L4_EIO;
3.17 + return pipe_error();
3.18
3.19 _mapper = mapper;
3.20
3.21 @@ -116,11 +116,19 @@
3.22 PageMapper *mapper = _paging->add_region();
3.23
3.24 if (mapper == NULL)
3.25 - return -L4_EIO;
3.26 + return pipe_error();
3.27
3.28 _mapper = mapper;
3.29
3.30 return current_region(populated_size, size);
3.31 }
3.32
3.33 +long PipePager::pipe_error()
3.34 +{
3.35 + if (_paging->closed())
3.36 + return -L4_EIO;
3.37 + else
3.38 + return -L4_EBUSY;
3.39 +}
3.40 +
3.41 // vim: tabstop=4 expandtab shiftwidth=4
4.1 --- a/libfsserver/lib/pipes/pipe_paging.cc Wed May 05 00:09:11 2021 +0200
4.2 +++ b/libfsserver/lib/pipes/pipe_paging.cc Fri May 07 00:31:02 2021 +0200
4.3 @@ -36,10 +36,19 @@
4.4 _queue = new PageQueuePartitioned();
4.5 _pages = new Pages(_memory, _queue);
4.6
4.7 + /* Reset the mappers associated with the regions. */
4.8 +
4.9 for (unsigned int i = 0; i < 2; i++)
4.10 _regions[i] = NULL;
4.11 }
4.12
4.13 +/* Return whether one or more endpoints have detached. */
4.14 +
4.15 +int PipePaging::closed()
4.16 +{
4.17 + return _endpoints < 2;
4.18 +}
4.19 +
4.20 /* Detach one endpoint. */
4.21
4.22 void PipePaging::detach()
4.23 @@ -131,9 +140,12 @@
4.24 delete mapper;
4.25 }
4.26
4.27 - /* Return the next region. */
4.28 + /* Select the next region. */
4.29
4.30 _reading = 1 - _reading;
4.31 +
4.32 + /* Return the next region's mapper. */
4.33 +
4.34 return _regions[_reading];
4.35 }
4.36