Patch title: Release 92 bulk changes
Abstract:
File: /linux/storage/bench.pli
Key:
    Removed line
    Added line
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/util/crypto/intn.pli"
module "filesystem.pli"

constant page_size 4096
constant bench_seconds 30
constant seek_unit 4096
constant transfert_unit 2^16
constant transfert_unit 4*2^20


function storage_bench device
  arg Str device
  random 2n # make sure random generator is initialised
  var Address buffer := memory_allocate (max seek_unit transfert_unit)+page_size null
  var Address b := cast (cast buffer uInt)+page_size-(cast buffer uInt)%page_size Address
  var Intn size := filesystem_query:device size
  console device " size is " size\2^20 " MB" eol

  (var Stream dev) open device in+safe+nocache
  var DateTime start := datetime ; var Int count := 0
  part seek_loop
    var Intn offset := random size
    offset := offset\seek_unit*seek_unit
    dev configure "seek "+string:offset
    dev raw_read b seek_unit
    count += 1
    if datetime:seconds-start:seconds<bench_seconds/2
      restart seek_loop
  var Float seek := (datetime:seconds-start:seconds)/count
  if dev=success
    console "average seek time is " (cast seek*10000 Int)/10 " ms" eol
  else
    console "failed to seek on " device eol

  (var Stream dev) open device in+safe+nocache
  var Intn offset := random:size\2
  offset := offset\transfert_unit*transfert_unit
  dev configure "seek "+string:offset
  var DateTime start := datetime ; var Int count := 0
  part transfert_loop
    dev raw_read b transfert_unit
    count += 1
    if datetime:seconds-start:seconds<bench_seconds/2
      restart transfert_loop
  var Float transfert := count*transfert_unit/(datetime:seconds-start:seconds)
  var Float transfert := (cast count Float)*transfert_unit/(datetime:seconds-start:seconds)
  if dev=success
    console "average transfert is " (cast 10*transfert/2^20 Int)/10 " MB/s  (at " (cast 100*offset\size Int) "%)" eol
  else
    console "failed to read on " device eol
  memory_free buffer


function storage_verify device
  arg Str device
  (var Stream dev) open device in+safe+nocache
  var Address buffer := memory_allocate 2*page_size null
  var Address b := cast (cast buffer uInt)+page_size-(cast buffer uInt)%page_size Address
  var DateTime start := datetime
  var uInt count := 0
  while dev=success
    dev raw_read b page_size
    if dev=success
      count += 1
  var DateTime stop := datetime
  var Float transfert := (cast count Float)*page_size/(stop:seconds-start:seconds)
  console "successfully red " count " pages in " (cast stop:seconds-start:seconds Int) " seconds (that's " 1n*count*page_size\2^20 " MB and " (cast 10*transfert/2^20 Int)/10 " MB/s)" eol
  memory_free buffer
  

export storage_bench storage_verify