changeset 19:c9d1a5a79254

fix ConcurrentQueue
author riono <e165729@ie.u-ryukyu.ac.jp>
date Tue, 01 Dec 2020 17:48:03 +0900
parents 8fe565f8acb8
children 3aaa77e12493
files daemon/Connection.cs datagear/DataGears.cs datagear/WaitList.cs
diffstat 3 files changed, 59 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/daemon/Connection.cs	Wed Nov 25 01:27:41 2020 +0900
+++ b/daemon/Connection.cs	Tue Dec 01 17:48:03 2020 +0900
@@ -10,7 +10,7 @@
     public Socket socket;
     public string name;
     //public CodeGearManager cgm;
-    public ConcurrentQueue<Command> sendQueue = new ConcurrentQueue<Command>();
+    public BlockingCollection<Command> sendQueue = new BlockingCollection<Command>();
     public bool sendManager = true;
     private object syncObject = new object();
     
@@ -22,7 +22,7 @@
     public Connection(){}
 
     public void SendCommand(Command cmd) {
-        sendQueue.Enqueue(cmd);
+        sendQueue.TryAdd(cmd);
     }
 
     /// <summary>
--- a/datagear/DataGears.cs	Wed Nov 25 01:27:41 2020 +0900
+++ b/datagear/DataGears.cs	Tue Dec 01 17:48:03 2020 +0900
@@ -7,8 +7,8 @@
 
 namespace Christie_net.datagear {
 public class DataGears {
-    protected SortedDictionary<string, ConcurrentQueue<DataGear<object>>> dataGears =
-        new SortedDictionary<string, ConcurrentQueue<DataGear<object>>>();
+    protected SortedDictionary<string, BlockingCollection<DataGear<object>>> dataGears =
+        new SortedDictionary<string, BlockingCollection<DataGear<object>>>();
 
     private readonly object syncObject = new object();
 
@@ -20,10 +20,10 @@
     public void Put(string key, DataGear<object> dg) {
         lock (syncObject) {
             if (dataGears.ContainsKey(key)) {
-                dataGears[key].Enqueue(dg);
+                dataGears[key].TryAdd(dg);
             } else {
-                var queue = new ConcurrentQueue<DataGear<object>>();
-                queue.Enqueue(dg);
+                var queue = new BlockingCollection<DataGear<object>>();
+                queue.TryAdd(dg);
                 dataGears.Add(key, queue);
             }
         }
@@ -35,19 +35,21 @@
     /// <param name="key"></param>
     /// <returns></returns>
     public object Take(string key) {
-        object data = null;
-        // Queueからの取得は参照渡し
-        DataGear<object> dataGear;
-        if (dataGears[key].TryDequeue(out dataGear)) {
-            data = dataGear.GetData();
+        lock (syncObject) {
+            object data = null;
+            // Queueからの取得は参照渡し
+            DataGear<object> dataGear;
+            if (dataGears[key].TryTake(out dataGear)) {
+                data = dataGear.GetData();
+            }
+
+            // DataGeraを削除取り出ししたのでkeyも削除
+            if (dataGears[key].IsCompleted) {
+                dataGears[key].Dispose();
+                dataGears.Remove(key);
+            }
+            return data;
         }
-        
-        // DataGeraを削除取り出ししたのでkeyも削除
-        if (dataGears[key].IsEmpty) {
-            dataGears.Remove(key);
-        }
-
-        return data;
     }
 
     /// <summary>
@@ -56,13 +58,15 @@
     /// <param name="key"></param>
     /// <returns></returns>
     public object Peek(string key) {
-        object data = null;
-        DataGear<object> dataGear;
-        if (dataGears[key].TryPeek(out dataGear)) {
-            data = dataGear.GetData();
+        lock (syncObject) {
+            object data = null;
+            DataGear<object> dataGear;
+            ConcurrentQueue<DataGear<object>> queue = new ConcurrentQueue<DataGear<object>>(dataGears[key]);
+            if (queue.TryPeek(out dataGear)) {
+                data = dataGear.GetData();
+            }
+            return data;
         }
-
-        return data;
     }
 
     /// <summary>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datagear/WaitList.cs	Tue Dec 01 17:48:03 2020 +0900
@@ -0,0 +1,30 @@
+using System.Collections;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using Christie_net.datagear.command;
+
+namespace Christie_net.datagear {
+public class WaitList {
+    private Dictionary<string, BlockingCollection<Command>> waitlist = new Dictionary<string, BlockingCollection<Command>>();
+    private object syncObject = new object();
+
+    public void add(Command cm) {
+        lock (syncObject) {
+            if (waitlist.ContainsKey(cm.key)) {
+                waitlist[cm.key].TryAdd(cm);
+            } else {
+                BlockingCollection<Command> queue = new BlockingCollection<Command>();
+                queue.TryAdd(cm);
+                waitlist.Add(cm.key, queue);
+            }
+        }
+    }
+
+
+    public bool ContainsKey(string key) {
+        lock (syncObject) {
+            return waitlist.ContainsKey(key);   
+        }
+    }
+}
+}
\ No newline at end of file