next up previous
Next: A.41 vc-snap.setl Up: A. WEBeye Source Code Previous: A.39 vc-seq.setl

  
A.40 vc-simpler.setl

Textually #included by:
vc-jumper.setl     (Section A.25 [vc-jumper.setl])
vc-mover.setl     (Section A.29 [vc-mover.setl])
vc-zoomer.setl     (Section A.43 [vc-zoomer.setl])

Textually #includes:
vc-exit.setl     (Section A.15 [vc-exit.setl])
vc-getname.setl     (Section A.16 [vc-getname.setl])
vc-msg.setl     (Section A.30 [vc-msg.setl])
vc-obtain.setl     (Section A.31 [vc-obtain.setl])
vc-provide.setl     (Section A.32 [vc-provide.setl])

Source code: *

-- This file is meant to be #included by others, after they define:
--
-- yhwh  -  the name of the program that #includes this code
-- service_name  -  e.g., `mover'
-- n_parms  -  1 or 2
-- build_cmd  -  statements to build cmd to send to the do service
 
const sigterm_fd = open (`SIGTERM', `signal');  -- catch TERM signals
const server_fd = fileno provide_service (service_name);
 
var clients := {};
 
loop
 
  [ready] := select ([{sigterm_fdserver_fd} + domain clients]);
 
  if sigterm_fd in ready then
    msg (yhwh + ` (' + str pid + `) caught SIGTERM');
    quit_gracefully;
  end if;
 
  for client = clients(pump_fd) | pump_fd in ready loop
    done_client (pump_fd);
  end loop;
 
  if server_fd in ready then
    fd := accept (server_fd);
    if fd /= om then
      name := getname fd;
      msg (name+` accepted');
      pump_fd := pump();
      if pump_fd = -1 then
        -- child
        do_fd := fileno obtain_service (`do');
        loop
          if (line := getline fd/= om and
             #(t := split (line)) = n_parms and
             forall parm in t | is_num parm then
            build_cmd
            writea (do_fdcmd);
            geta (do_fdresponse);
            printa (fdresponse);  -- normally an empty line
          else
            stop;
          end if;
        end loop;
      end if;
      -- parent continues here
      close (fd);
      client := {};
      client.name := name;
      clients(pump_fd) := client;
    end if;
  end if;
 
end loop;
 
op is_num (a);
  return a(`^[+-]?[0-9]+(\\.[0-9]+)?$') /= om;
end op;
 
proc done_client (pump_fd);
  msg (clients(pump_fd).name + ` done');
  close (pump_fd);
  clients(pump_fd) := om;
end proc done_client;
 
proc quit_gracefully;
  exit_gracefully ([[`pump for client ' + client.namepump_fd] :
                                          client = clients(pump_fd)]);
end proc;
 
#include ``vc-provide.setl''
#include ``vc-obtain.setl''
#include ``vc-getname.setl''
#include ``vc-exit.setl''
#include ``vc-msg.setl''


next up previous
Next: A.41 vc-snap.setl Up: A. WEBeye Source Code Previous: A.39 vc-seq.setl
David Bacon
1999-12-10