@@ -10,6 +10,7 @@ import std.string;
10
10
import std.traits ;
11
11
import std.typecons ;
12
12
import libasync.events : EventLoop_ = EventLoop, NetworkAddress;
13
+ import libasync.signal : AsyncSignal;
13
14
import libasync.timer : AsyncTimer;
14
15
import libasync.tcp : AsyncTCPConnection, AsyncTCPListener, TCPEvent;
15
16
import libasync.threads : destroyAsyncThreads, gs_threads;
@@ -39,6 +40,9 @@ package class LibasyncEventLoop : EventLoop
39
40
private Appender! (CallbackHandle[]) nextCallbacks2;
40
41
private Appender! (CallbackHandle[])* currentAppender;
41
42
43
+ private Appender! (CallbackHandle[]) nextThreadSafeCallbacks;
44
+ private shared AsyncSignal newThreadSafeCallbacks;
45
+
42
46
private LibasyncTransport[] pendingConnections;
43
47
44
48
alias Listener = Tuple ! (ServerImpl, " server" , AsyncTCPListener, " listener" );
@@ -50,6 +54,9 @@ package class LibasyncEventLoop : EventLoop
50
54
this .eventLoop = new EventLoop_;
51
55
this .timers = new Timers(this .eventLoop);
52
56
this .currentAppender = &nextCallbacks1;
57
+
58
+ this .newThreadSafeCallbacks = new shared AsyncSignal(this .eventLoop);
59
+ this .newThreadSafeCallbacks.run(&scheduleThreadSafeCallbacks);
53
60
}
54
61
55
62
override void runForever ()
@@ -97,6 +104,27 @@ package class LibasyncEventLoop : EventLoop
97
104
currentAppender.put(callback);
98
105
}
99
106
107
+ private void scheduleThreadSafeCallbacks ()
108
+ {
109
+ synchronized (this )
110
+ {
111
+ foreach (callback; nextThreadSafeCallbacks.data)
112
+ scheduleCallback(callback);
113
+
114
+ nextThreadSafeCallbacks.clear;
115
+ }
116
+ }
117
+
118
+ override void scheduleCallbackThreadSafe (CallbackHandle callback)
119
+ {
120
+ synchronized (this )
121
+ {
122
+ nextThreadSafeCallbacks ~= callback;
123
+ }
124
+
125
+ newThreadSafeCallbacks.trigger;
126
+ }
127
+
100
128
override void scheduleCallback (Duration delay, CallbackHandle callback)
101
129
{
102
130
if (delay <= Duration.zero)
0 commit comments