Patch title: Release 93 bulk changes
Abstract:
File: /protocol/http/trace.page
Key:
    Removed line
    Added line
   
module "/pliant/language/unsafe.pli"
module "/pliant/language/context.pli"
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/debug/trace.pli"


type HttpTrace
module "/pliant/language/unsafe.pli"
module "/pliant/language/context.pli"
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/debug/trace.pli"


type HttpTrace
  field Link:Stream stream ; field CBool flushed
  field FastSem sem ; field CBool locked
  field Link:Stream stream
  field CBool timestamp


method h line message
  arg_rw HttpTrace h ; arg Str message


method h line message
  arg_rw HttpTrace h ; arg Str message
  var Link:Stream s :> h stream
  s writeline message
  h flushed := false
  if h:stream=failure and h:locked
    ((addressof h:sem) map Sem) release
    h locked := false
  if h:timestamp
    h:stream writechars string:datetime+"  "
  h:stream writeline message

method h flush
  arg_rw HttpTrace h

method h flush
  arg_rw HttpTrace h
  if not h:flushed
    var Link:Stream s :> h stream
    s flush anytime
    h flushed := true
    if h:stream=failure and h:locked
      h locked := false
      h:sem release
  h:stream flush anytime






var Bool timestamp := false
select " " timestamp noeol
  option "without timestamp" "false"
  option "with timestamp" "true"

button "Start tracing"
  reset_http_answer
  http_request send_header "mime [dq]text/plain[dq]"
  var Link:HttpTrace h :> new HttpTrace
button "Start tracing"
  reset_http_answer
  http_request send_header "mime [dq]text/plain[dq]"
  var Link:HttpTrace h :> new HttpTrace
  h stream :> http_request answer_stream ; h flushed := true
  h:sem request ; h locked := true
  h stream :> http_request answer_stream
  h timestamp := timestamp
  trace_slots_sem request
  var Pointer:Arrow cc :> trace_slots:first
  while cc<>null
    var Pointer:TraceSlot slot2 :> cc map TraceSlot
    if slot2:name=service
      h bind slot2
    cc :> trace_slots next cc
  trace_slots_sem release
  trace_slots_sem request
  var Pointer:Arrow cc :> trace_slots:first
  while cc<>null
    var Pointer:TraceSlot slot2 :> cc map TraceSlot
    if slot2:name=service
      h bind slot2
    cc :> trace_slots next cc
  trace_slots_sem release
  h:sem request ; h:sem release
  while http_request:answer_stream=success
    sleep 2
  trace_slots_sem request
  var Pointer:Arrow cc :> trace_slots:first
  while cc<>null
    var Pointer:TraceSlot slot2 :> cc map TraceSlot
    if slot2:name=service
      h unbind slot2
    cc :> trace_slots next cc
  trace_slots_sem release
  http_request send_footer

  trace_slots_sem request
  var Pointer:Arrow cc :> trace_slots:first
  while cc<>null
    var Pointer:TraceSlot slot2 :> cc map TraceSlot
    if slot2:name=service
      h unbind slot2
    cc :> trace_slots next cc
  trace_slots_sem release
  http_request send_footer