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:
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){