# HG changeset patch # User Paul Boddie # Date 1620340262 -7200 # Node ID d3ed5dc0b98dcf5e123a55a20a22b9fc2496cef5 # Parent 13859678adc286f0dc46ed04c2c66cad415cb318 Produce different error codes depending on whether endpoints have been closed. diff -r 13859678adc2 -r d3ed5dc0b98d libfsserver/include/fsserver/pipe_pager.h --- a/libfsserver/include/fsserver/pipe_pager.h Wed May 05 00:09:11 2021 +0200 +++ b/libfsserver/include/fsserver/pipe_pager.h Fri May 07 00:31:02 2021 +0200 @@ -42,6 +42,8 @@ virtual long next_region_for_writer(offset_t *populated_size, offset_t *size); + virtual long pipe_error(); + public: explicit PipePager(PipePaging *paging, bool writer); diff -r 13859678adc2 -r d3ed5dc0b98d libfsserver/include/fsserver/pipe_paging.h --- a/libfsserver/include/fsserver/pipe_paging.h Wed May 05 00:09:11 2021 +0200 +++ b/libfsserver/include/fsserver/pipe_paging.h Fri May 07 00:31:02 2021 +0200 @@ -69,6 +69,10 @@ virtual PageMapper *current_region(); virtual PageMapper *next_region(); + + /* Access management. */ + + virtual int closed(); }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r 13859678adc2 -r d3ed5dc0b98d libfsserver/lib/pipes/pipe_pager.cc --- a/libfsserver/lib/pipes/pipe_pager.cc Wed May 05 00:09:11 2021 +0200 +++ b/libfsserver/lib/pipes/pipe_pager.cc Fri May 07 00:31:02 2021 +0200 @@ -77,7 +77,7 @@ return L4_EOK; } else - return -L4_EIO; + return pipe_error(); } /* Obtain the next region and its details. */ @@ -97,7 +97,7 @@ PageMapper *mapper = _paging->next_region(); if (mapper == NULL) - return -L4_EIO; + return pipe_error(); _mapper = mapper; @@ -116,11 +116,19 @@ PageMapper *mapper = _paging->add_region(); if (mapper == NULL) - return -L4_EIO; + return pipe_error(); _mapper = mapper; return current_region(populated_size, size); } +long PipePager::pipe_error() +{ + if (_paging->closed()) + return -L4_EIO; + else + return -L4_EBUSY; +} + // vim: tabstop=4 expandtab shiftwidth=4 diff -r 13859678adc2 -r d3ed5dc0b98d libfsserver/lib/pipes/pipe_paging.cc --- a/libfsserver/lib/pipes/pipe_paging.cc Wed May 05 00:09:11 2021 +0200 +++ b/libfsserver/lib/pipes/pipe_paging.cc Fri May 07 00:31:02 2021 +0200 @@ -36,10 +36,19 @@ _queue = new PageQueuePartitioned(); _pages = new Pages(_memory, _queue); + /* Reset the mappers associated with the regions. */ + for (unsigned int i = 0; i < 2; i++) _regions[i] = NULL; } +/* Return whether one or more endpoints have detached. */ + +int PipePaging::closed() +{ + return _endpoints < 2; +} + /* Detach one endpoint. */ void PipePaging::detach() @@ -131,9 +140,12 @@ delete mapper; } - /* Return the next region. */ + /* Select the next region. */ _reading = 1 - _reading; + + /* Return the next region's mapper. */ + return _regions[_reading]; }