Patch title: Release 87 bulk changes
Abstract:
File: /pliant/protocol/common/tcp_server.pli
Key:
    Removed line
    Added line
   
abstract
  [This module is expected to help create various servers us


named_expression declare_fields
  field Str name <- n
  field Array:Str channel
  field Int port <- p
  field CBool detached <- false
  field DateTime since
abstract
  [This module is expected to help create various servers us


named_expression declare_fields
  field Str name <- n
  field Array:Str channel
  field Int port <- p
  field CBool detached <- false
  field DateTime since
  field Str welcome_message
  field Int ports_count <- 0
  field Int clients_count <- 0
  field CBool please_stop <- false
  if secured_channel_support
    field CBool secured <- false
    field Int secured_port <- undefined


method server start -> status
  oarg_rw TcpServer server ; arg Status status
  if server:since=defined
    return
  if server:channel:size=0
    server channel += "tcp:/server/"+(string server:port)
    var Link:Stream s :> new Stream
    s open "tcp:/client/"+(string server:port) in+out+safe
    if s=success
      if not quiet
  field Int ports_count <- 0
  field Int clients_count <- 0
  field CBool please_stop <- false
  if secured_channel_support
    field CBool secured <- false
    field Int secured_port <- undefined


method server start -> status
  oarg_rw TcpServer server ; arg Status status
  if server:since=defined
    return
  if server:channel:size=0
    server channel += "tcp:/server/"+(string server:port)
    var Link:Stream s :> new Stream
    s open "tcp:/client/"+(string server:port) in+out+safe
    if s=success
      if not quiet
        compile_message ""
        console "TCP port "+(string server:port)+" is used b
      return failure
    s open server:channel:0 "noautoconnect" in+out+safe
    if s=failure
      return failure
    s :> null map Stream
  else
    server port := undefined
  if secured_channel_support
    if server:secured
      if server:secured_port=undefined
        server:secured_port := server:port+500
      server channel += "channel:/server/"+(string server:se
  if (server start_checkup)=failure
    return failure
  server record
        console "TCP port "+(string server:port)+" is used b
      return failure
    s open server:channel:0 "noautoconnect" in+out+safe
    if s=failure
      return failure
    s :> null map Stream
  else
    server port := undefined
  if secured_channel_support
    if server:secured
      if server:secured_port=undefined
        server:secured_port := server:port+500
      server channel += "channel:/server/"+(string server:se
  if (server start_checkup)=failure
    return failure
  server record
  if not quiet
    console server:name " server is running" (shunt server:p
    if secured_channel_support
      if server:secured
        console " (secured port " server:secured_port ")"
    if server:detached
      console " (detached)"
    console eol
  compile_message ""
  if server:welcome_message<>""
    console server:welcome_message eol
  eif not quiet
    console server:name " server is running." eol
  server:ports_count := server:channel:size
  for (var Int i) server:channel:size-1 (shunt server:detach
    thread
      share:server main_loop server:channel:i
  if not server:detached
    server main_loop server:channel:0
    tcp_shutdown_sem request ; tcp_shutdown_sem release
  status := success


method server stop timeout
  oarg_rw TcpServer server ; arg Float timeout
  var DateTime start := datetime
  server please_stop := true
  server stop_checkup
  for (var Int i) server:channel:size-1 0 step -1
    var Str name := server:channel:i
    name := replace name "/server/" "/client/"
    name := replace name "channel:" "tcp:"
    (var Stream s) open name in+out+safe
    s close
  while server:ports_count<>0 and datetime:seconds-start:sec
    sleep 0.1
  while server:clients_count<>0 and datetime:seconds-start:s
    sleep 0.1
  server please_stop := false
  server unrecord
  if not quiet
  server:ports_count := server:channel:size
  for (var Int i) server:channel:size-1 (shunt server:detach
    thread
      share:server main_loop server:channel:i
  if not server:detached
    server main_loop server:channel:0
    tcp_shutdown_sem request ; tcp_shutdown_sem release
  status := success


method server stop timeout
  oarg_rw TcpServer server ; arg Float timeout
  var DateTime start := datetime
  server please_stop := true
  server stop_checkup
  for (var Int i) server:channel:size-1 0 step -1
    var Str name := server:channel:i
    name := replace name "/server/" "/client/"
    name := replace name "channel:" "tcp:"
    (var Stream s) open name in+out+safe
    s close
  while server:ports_count<>0 and datetime:seconds-start:sec
    sleep 0.1
  while server:clients_count<>0 and datetime:seconds-start:s
    sleep 0.1
  server please_stop := false
  server unrecord
  if not quiet
    console server:name " server is down." eol
    console server:name " server stopped." eol