----------------------------------------------------------------------- -- keystore-io-refs -- IO stream reference holder -- Copyright (C) 2019, 2020 Stephane Carrez -- Written by Stephane Carrez (Stephane.Carrez@gmail.com) -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- See the License for the specific language governing permissions and -- limitations under the License. ----------------------------------------------------------------------- with Ada.Unchecked_Deallocation; package body Keystore.IO.Refs is use type Util.Concurrent.Counters.Counter_Access; function Create (Stream : in Wallet_Stream_Access) return Stream_Ref is begin return Result : Stream_Ref do Result.Stream := Stream; Result.Counter := new Util.Concurrent.Counters.Counter; Util.Concurrent.Counters.Increment (Result.Counter.all); end return; end Create; function Value (Object : in Stream_Ref) return Wallet_Stream_Access is begin return Object.Stream; end Value; procedure Free is new Ada.Unchecked_Deallocation (Object => Util.Concurrent.Counters.Counter, Name => Util.Concurrent.Counters.Counter_Access); procedure Free is new Ada.Unchecked_Deallocation (Object => IO.Wallet_Stream'Class, Name => IO.Wallet_Stream_Access); overriding procedure Finalize (Object : in out Stream_Ref) is Release : Boolean; begin if Object.Counter /= null then Util.Concurrent.Counters.Decrement (Object.Counter.all, Release); if Release then Object.Stream.Close; Free (Object.Stream); Free (Object.Counter); else Object.Stream := null; Object.Counter := null; end if; end if; end Finalize; overriding procedure Adjust (Object : in out Stream_Ref) is begin if Object.Counter /= null then Util.Concurrent.Counters.Increment (Object.Counter.all); end if; end Adjust; end Keystore.IO.Refs;