BastliBridge

A bot framework bridgin multiple IM protocols, and mail
git clone git://xatko.vsos.ethz.ch/BastliBridge.git
Log | Files | Refs | Submodules

commit 33d3c31422e4e9e5191466ac62ff091727463498
parent 4f6332310c1ec905d771bf2cbb84032528ec15f3
Author: Dominik Schmidt <dominik@schm1dt.ch>
Date:   Wed, 12 Sep 2018 23:42:45 +0200

Restart services if needed (always, at that point)

Diffstat:
src/bastlibridge/base.d | 1+
src/bastlibridge/manager.d | 27++++++++++++++++++++++-----
2 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/src/bastlibridge/base.d b/src/bastlibridge/base.d @@ -20,6 +20,7 @@ abstract class Endpoint{ package string cmdline; protected Mutex mtx; protected SysTime lastUpdate; + bool restart=true; protected void heartbeat(){ lastUpdate=Clock.currTime; diff --git a/src/bastlibridge/manager.d b/src/bastlibridge/manager.d @@ -55,6 +55,17 @@ class Manager{ * Syntax: name=basetype:argstring */ void addEndpoint(string cmdline){ + auto ep=createEndpoint(cmdline); + addProcess(Process(ep)); + } + + void addProcess(Process p){ + synchronized(endpoints_lock.writer){ + endpoints[p.endpoint.name]=p; + } + } + + Endpoint createEndpoint(string cmdline){ string cmdlinetmp=cmdline; string name,basetype,args; cmdline.formattedRead!"%s=%s:%s"(name,basetype,args); @@ -64,9 +75,7 @@ class Manager{ auto ep=endpointTypes.get(this, basetype, args); ep.name=name; ep.cmdline=cmdlinetmp; - synchronized(endpoints_lock.writer){ - endpoints[name]=Process(ep); - } + return ep; } void dumpConfig(scope void delegate(in char[] s) writer){ @@ -103,6 +112,15 @@ class Manager{ Thread.sleep(1000.dur!"msecs"); } + void handleExit(string name){ + auto p=getEndpoint(name); + p.thread.join(); + removeEndpoint(name); + if(p.endpoint.restart){ + addEndpoint(p.endpoint.cmdline); + } + } + auto serve(){ trace("waiting for messages"); bool finished=false; @@ -110,8 +128,7 @@ class Manager{ receive( (string name){ trace("Manager is terminating thread ", name); - getEndpoint(name).thread.join; - removeEndpoint(name); + handleExit(name); trace("Current endpoint count ", endpoints.length); }, (Manager.Control mc){