"Cryostat" (Genesis)

cryodemo.adb


   1 ------------------------------------------------------------------------------
   2 ------------------------------------------------------------------------------
   3 -- This file is part of 'CryoDemo', a tutorial example for 'Cryostat'.      --
   4 --                                                                          --
   5 -- (C) 2020 Stanislav Datskovskiy ( www.loper-os.org )                      --
   6 -- http://wot.deedbot.org/17215D118B7239507FAFED98B98228A001ABFFC7.html     --
   7 --                                                                          --
   8 -- You do not have, nor can you ever acquire the right to use, copy or      --
   9 -- distribute this software ; Should you use this software for any purpose, --
  10 -- or copy and distribute it to anyone or in any manner, you are breaking   --
  11 -- the laws of whatever soi-disant jurisdiction, and you promise to         --
  12 -- continue doing so for the indefinite future. In any case, please         --
  13 -- always : read and understand any software ; verify any PGP signatures    --
  14 -- that you use - for any purpose.                                          --
  15 ------------------------------------------------------------------------------
  16 ------------------------------------------------------------------------------
  17 
  18 with Interfaces;  use Interfaces;
  19 with ada.text_io; use  ada.text_io;
  20 
  21 with Cryostat;
  22 
  23 
  24 procedure CryoDemo is
  25    
  26    -- Path on disk for the example Cryostat backing file :
  27    File_Path : constant String := "cryotest.bin";
  28    
  29    -- Now, let's define an example data structure to place in a Cryostat :
  30    
  31    -- Example payload array's element type: byte.
  32    subtype ADatum is Unsigned_8;
  33    
  34    -- Let's make it 512MB - far bigger than a typical stack, to demonstrate
  35    -- that it will in fact reside in the Cryostat, rather than on the stack :
  36    A_MBytes : constant Unsigned_32 := 512;
  37    
  38    -- Example payload: an array.
  39    subtype ARange is Unsigned_32 range 0 .. (A_MBytes * 1024 * 1024) - 1;
  40    
  41    -- Complete the definition of the payload data structure :
  42    type TestArray is array(ARange) of ADatum;
  43    
  44    -- Declare a Cryostat which stores a TestArray :
  45    package Cryo is new Cryostat(Form     => TestArray,
  46                                 Path     => File_Path,
  47                                 Writable => True,  -- Permit writing
  48                                 Create   => True); -- Create file if not exists
  49    
  50    -- Handy reference to the payload; no pointerisms needed !
  51    T : TestArray renames Cryo.Item;
  52    
  53    -- T can now be treated as if it lived on the stack :
  54    
  55 begin
  56    
  57    Put_Line("T(0)    before :  " & ADatum'Image(T(0)));
  58    Put_Line("T(Last) before :  " & ADatum'Image(T(T'Last)));
  59    
  60    -- Increment each of the elements of T :
  61    for i in T'Range loop
  62       T(i) := T(i) + 1;
  63    end loop;
  64    
  65    Put_Line("T(0)    after  :  " & ADatum'Image(T(0)));
  66    Put_Line("T(Last) after  :  " & ADatum'Image(T(T'Last)));
  67    
  68    --- Optional, finalizer always syncs in this example
  69    --  Cryo.Sync;
  70    
  71    --- Test of Zap -- uncomment and get zeroized payload every time :
  72    --  Cryo.Zap;
  73    
  74    Put_Line("OK.");
  75    
  76 end CryoDemo;