view codegear/CodeGearManager.cs @ 33:7575980bffc9

update
author riono <e165729@ie.u-ryukyu.ac.jp>
date Tue, 20 Apr 2021 18:42:17 +0900
parents 84e0b85af821
children
line wrap: on
line source

using System;
using System.Collections.Concurrent;
using System.Threading;
using Christie_net.daemon;
using Christie_net.datagear;
using Christie_net.datagear.command;

namespace Christie_net.codegear {
public class CodeGearManager {
    private ConcurrentDictionary<string, DataGearManager> dgmList = new ConcurrentDictionary<string, DataGearManager>();
    private ConcurrentDictionary<int, CodeGearManager> cgmList;
    private ThreadPoolExecutors threadPoolExecutors;
    private LocalDataGearManager localDgm = new LocalDataGearManager();
    private ConcurrentDictionary<string, IncomingTcpConnection> acceptHash =
        new ConcurrentDictionary<string, IncomingTcpConnection>();
    public int cgmID;
    public ChristieDaemon daemon;
    public int localPort;

    public CodeGearManager(int cgmID, ThreadPoolExecutors exe, ConcurrentDictionary<int, CodeGearManager> cgmList, int localPort) {
        this.dgmList.TryAdd("local", localDgm);
        this.cgmList = cgmList;
        this.threadPoolExecutors = exe;
        this.cgmID = cgmID;
        this.localPort = localPort;
        this.daemon = new ChristieDaemon(localPort, this);
        this.daemon.Listen();
    }

    public LocalDataGearManager GetLocalDGM() {
        return localDgm;
    }

    public DataGearManager GetDGM(string dgmName) {
        if (dgmList.ContainsKey(dgmName)) {
            return dgmList[dgmName];
        } else {
            throw new ArgumentNullException("DGM " + dgmName + " is not found");
        }
    }

    public RemoteDataGearManager CreateRemoteDGM(string dgmName, string address, int port) {
        RemoteDataGearManager remote = new RemoteDataGearManager(dgmName ,address, port, this);
        dgmList.TryAdd(dgmName, remote);

        return remote;
    }

    public void Submit(CodeGear cg) {
        threadPoolExecutors.Execute(cg.GetCge());
    }

    public void Setup(CodeGear cg, int priority = 5) {
        cg.Setup(this, priority);
    }

    public ConcurrentDictionary<int, CodeGearManager> GetCgmList() {
        return cgmList;
    }

    public ConcurrentDictionary<string, DataGearManager> GetDgmList() {
        return dgmList;
    }

    public bool ContainsDgm(string dgmName) {
        return dgmList.ContainsKey(dgmName);
    }

    public void SetAccept(string key, IncomingTcpConnection incoming) {
        acceptHash.TryAdd(key, incoming);
    }

    // broadcast data
    public void PutAllDgm(string key, Object data) {
        foreach (var dgm in dgmList.Values) {
            dgm.Put(key, data);
        }
    }
}
}