# HG changeset patch # User Paul Boddie # Date 1679670884 -3600 # Node ID 754959243588dbc143ca0140ee2e0fd7bf149395 # Parent f2f170ce32e85b36c7feccb5f24f51f59c9f90f8 Sought to prevent a race condition when deleting pipe paging coordinators. diff -r f2f170ce32e8 -r 754959243588 libfsserver/include/fsserver/pipe_paging.h --- a/libfsserver/include/fsserver/pipe_paging.h Fri Mar 24 00:46:26 2023 +0100 +++ b/libfsserver/include/fsserver/pipe_paging.h Fri Mar 24 16:14:44 2023 +0100 @@ -1,7 +1,7 @@ /* * A pipe paging coordinator, permitting memory sharing pipe endpoints. * - * Copyright (C) 2021 Paul Boddie + * Copyright (C) 2021, 2023 Paul Boddie * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -21,6 +21,7 @@ #pragma once +#include #include #include @@ -39,6 +40,7 @@ Memory *_memory; Pages *_pages; PageQueue *_queue; + std::mutex _lock; /* Regions acting as files with their own accessors. */ diff -r f2f170ce32e8 -r 754959243588 libfsserver/lib/pipes/pipe_pager.cc --- a/libfsserver/lib/pipes/pipe_pager.cc Fri Mar 24 00:46:26 2023 +0100 +++ b/libfsserver/lib/pipes/pipe_pager.cc Fri Mar 24 16:14:44 2023 +0100 @@ -58,8 +58,6 @@ if (_paging == NULL) return; - unsigned int attached = _paging->detach(); - /* Notify the other endpoint and unsubscribe. */ _paging->notify_others(_writing ? PipePaging::WRITER : PipePaging::READER, @@ -68,7 +66,7 @@ /* Deallocate the paging coordinator if no other endpoints are active. */ - if (!attached) + if (!_paging->detach()) { delete _paging; _paging = NULL; diff -r f2f170ce32e8 -r 754959243588 libfsserver/lib/pipes/pipe_paging.cc --- a/libfsserver/lib/pipes/pipe_paging.cc Fri Mar 24 00:46:26 2023 +0100 +++ b/libfsserver/lib/pipes/pipe_paging.cc Fri Mar 24 16:14:44 2023 +0100 @@ -81,6 +81,8 @@ unsigned int PipePaging::detach() { + std::lock_guard guard(_lock); + if (_active_endpoints) _active_endpoints--;