# HG changeset patch # User Paul Boddie # Date 1616713410 -3600 # Node ID 84bc31650a9a086b524919f0b2eb9e64e822d9b3 # Parent 3e4d7c4e617e5f2bc775cadd098b19a7691a91b3 Introduced support for closing pipe resources. diff -r 3e4d7c4e617e -r 84bc31650a9a files/pipe_paging.cc --- a/files/pipe_paging.cc Thu Mar 25 01:42:50 2021 +0100 +++ b/files/pipe_paging.cc Fri Mar 26 00:03:30 2021 +0100 @@ -5,6 +5,30 @@ { } +/* Detach one endpoint. */ + +void PipePaging::detach() +{ + if (!_endpoints) + return; + else + _endpoints--; + + if (_endpoints) + return; + + /* Discard all regions from the pipe. */ + + while (!_regions.empty()) + { + PageMapper *mapper = _regions.front(); + + _regions.pop_front(); + mapper->detach(); + delete mapper; + } +} + /* Add a region to the sequence. */ void PipePaging::add_region(PageMapper *mapper) @@ -31,7 +55,16 @@ if (_accessors.size() > _regions.size()) _accessors.pop_front(); + /* Detach and discard the current page mapper. */ + + PageMapper *mapper = _regions.front(); + _regions.pop_front(); + mapper->detach(); + delete mapper; + + /* Return the next region. */ + return _regions.front(); } else diff -r 3e4d7c4e617e -r 84bc31650a9a files/pipe_paging.h --- a/files/pipe_paging.h Thu Mar 25 01:42:50 2021 +0100 +++ b/files/pipe_paging.h Fri Mar 26 00:03:30 2021 +0100 @@ -23,9 +23,23 @@ offset_t _size; + /* Endpoint status. */ + + unsigned int _endpoints = 2; + public: explicit PipePaging(offset_t size); + virtual void detach(); + + virtual PagesConserving *pages() + { return &_pages; } + + virtual offset_t region_size() + { return _size; } + + /* Region management. */ + virtual void add_region(PageMapper *mapper); virtual PageMapper *first_region(); @@ -33,12 +47,6 @@ virtual PageMapper *next_region(); virtual PipeAccessor *accessor(); - - virtual PagesConserving *pages() - { return &_pages; } - - virtual offset_t region_size() - { return _size; } }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r 3e4d7c4e617e -r 84bc31650a9a pipe_pager.cc --- a/pipe_pager.cc Thu Mar 25 01:42:50 2021 +0100 +++ b/pipe_pager.cc Fri Mar 26 00:03:30 2021 +0100 @@ -26,6 +26,14 @@ +/* Close the pager, releasing the paging coordinator for the pipe. This will + release all active page mappers. */ + +void PipePager::close() +{ + _paging->detach(); +} + /* Support paging. */ long PipePager::map(unsigned long offset, l4_addr_t hot_spot, flags_t flags, l4_snd_fpage_t *region) @@ -74,11 +82,6 @@ if (mapper == NULL) return -L4_EIO; - /* Detach and discard the current page mapper. */ - - _mapper->detach(); - delete _mapper; - _mapper = mapper; } diff -r 3e4d7c4e617e -r 84bc31650a9a pipe_pager.h --- a/pipe_pager.h Thu Mar 25 01:42:50 2021 +0100 +++ b/pipe_pager.h Fri Mar 26 00:03:30 2021 +0100 @@ -22,6 +22,8 @@ public: explicit PipePager(PipePaging *paging, bool writer); + virtual void close(); + /* Server details. */ int expected_items();