next up previous
Next: A.2 vc-allowed.setl Up: A. WEBeye Source Code Previous: A. WEBeye Source Code

  
A.1 vc-admin.setl

Textually #included by:
vc-cron.setl     (Section A.9 [vc-cron.setl])
vc-go.setl     (Section A.18 [vc-go.setl])
vc-quit.setl     (Section A.35 [vc-quit.setl])
vc-restart.setl     (Section A.37 [vc-restart.setl])
vc-toplev.setl     (Section A.42 [vc-toplev.setl])

Source code: *

--  Management services, principally relating to the creation,
--  interpretation, and removal of mutual exclusion (mutex) locks.
--
--  Use:  #include me after you define yhwh and my_lock.
 
proc msg (s);  -- log directly on stdout (cf. msg in vc-msg.setl)
  spew (yhwh + ` : ' + s);
end proc;
 
proc spew (s);  -- log a timestamped message
  print (fdate(tod), `:', s);
  flush (stdout);
end proc;
 
proc commence;  -- acquire mutex or abend immediately
  var texttrc;
  make_symlink;
  if last_error /= no_error then
    msg (`Cannot obtain lock file ' + my_lock + ` - ' + last_error);
    if (text := readlink my_lock/= om then
      msg (`Another instance of ' + yhwh + ` may be running.');
      msg (`Currently, ' + render_lock text + `.');
      msg (`Please check processes and do a ' + str (`rm ' + my_lock) +
                                                     ` if necessary.');
      if yhwh = `vc-toplev.setlthen
        msg (``You can use 'vc-quit' to make sure the Box is stopped,'');
        msg (``and then 'vc-check' to check for old processes.'');
        msg (``Finally, 'vc-restart' will clear out '' + str my_lock);
        msg (``and manage the log files for you.'');
      end if;
    end if;
    rc := 1;
    msg (`Exiting with status = ' + str rc + `.');
    stop rc;
  end if;
end proc;
 
proc make_symlink;
  clear_error;
  symlink (yhwh + ` (pid ' + str pid + `) started at ' + str tod,
           my_lock);
end proc;
 
op render_lock (text);
  return render_link (my_locktext);
end op;
 
proc render_link (nametext);
  var t;
  return name + ` -> ' + text +
          if (t := extract_timestamp text/= om
          then ` [' + fdate(t) + `]'
          else `'
          end if;
end proc;
 
-- Extract the last ``field'' in text as a timestamp if possible:
op extract_timestamp (text);
  var t;
  t := split (text);
  t := t(#t);
  if t(`[1-9][0-9]*') = t then
    t := val t;
    if t <= tod + 10*365*24*60*60*1000 then
      return t;
    end if;
  end if;
  return om;
end op;
 
-- Extract the pid embedded in text if possible:
op extract_pid (text);
  var p;
  if (p := text(`\\(pid '..`\\)')) /= om then
    p := p(6..#p-1);
    if p(`[1-9][0-9]*') = p then
      p := val p;
      -- This is well beyond the current range of Unix pid numbers:
      if p < 2**31 then
        return p;
      end if;
    end if;
  end if;
  return om;
end op;
 
proc finis (rc);  -- release mutex and yield status code rc to system
  unlink (my_lock);
  stop rc;
end proc;


next up previous
Next: A.2 vc-allowed.setl Up: A. WEBeye Source Code Previous: A. WEBeye Source Code
David Bacon
1999-12-10