with Ada.Command_Line;
with Ada.Text_IO; use Ada.Text_IO;
with DirX.Examples;
with DirX.Observables;
with Rx.Schedulers;
with Rx.Subscriptions;
with System.Multiprocessors;
procedure DirX.Hash_Recursive is
use Ada.Command_Line;
use Observables;
use Observables.RxEntries.Observables;
use Examples.RxHashed.Observables;
use Examples.Entry_To_Hash;
Target : constant Path := (if Argument_Count = 0
then "."
else Argument (1));
Context : String (1 .. 3) := "1-1";
-------------
-- Inspect --
-------------
procedure Inspect (Kind : Rx.Rx_Event_Kinds;
Since_Previous : Duration;
Since_Subscription : Duration)
is
pragma Unreferenced (Since_Previous);
use all type Rx.Rx_Event_Kinds;
begin
if Kind = On_Complete then
New_Line;
Put_Line ("Wall time [" & Context & "]:" & Since_Subscription'Img);
else
null;
-- Put_Line ("Incr time [" & Context & "]:" & Since_Previous'Img);
end if;
end Inspect;
Sub : Rx.Subscriptions.Subscription;
begin
Put_Line ("Number of CPUs:" & System.Multiprocessors.Number_Of_CPUs'Img);
-- Sequential listing & hashing of files, with printing
Sub :=
Directory_Entries (Target, Recursive => True)
& Examples.Hash'Access
& Subscribe (On_Next => Examples.Print_Hash'Access);
-- Sequential timing
Sub :=
Directory_Entries (Target, Recursive => True)
& Examples.Hash'Access
& Stopwatch (Inspect'Unrestricted_Access)
& Subscribe;
-- Parallel hashing timing
Context := "1-N";
Sub :=
Directory_Entries (Target, Recursive => True)
& Flat_Map (Observe_On (Rx.Schedulers.Computation)
& Examples.Hash'Access)
& Stopwatch (Inspect'Unrestricted_Access)
& Subscribe;
while Sub.Is_Subscribed loop
delay 0.1;
end loop;
-- Parallel enumeration and hashing
Context := "M-N";
Sub :=
Directory_Entries (Target, Recursive => False)
& Expand (Observe_On (Rx.Schedulers.IO)
& Dirx.Observables.Observe'Access)
& Flat_Map (Observe_On (Rx.Schedulers.Computation)
& Examples.Hash'Access)
& Stopwatch (Inspect'Unrestricted_Access)
& Subscribe; -- (On_Next => Examples.Print_Hash'Access);
while Sub.Is_Subscribed loop
delay 0.1;
end loop;
end DirX.Hash_Recursive;