5757import org .agrona .DeadlineTimerWheel .TimerHandler ;
5858import org .agrona .DirectBuffer ;
5959import org .agrona .MutableDirectBuffer ;
60- import org .agrona .collections .ArrayUtil ;
6160import org .agrona .collections .Int2ObjectHashMap ;
6261import org .agrona .collections .Long2ObjectHashMap ;
6362import org .agrona .concurrent .Agent ;
6867import org .agrona .concurrent .status .AtomicCounter ;
6968import org .agrona .concurrent .status .CountersManager ;
7069import org .agrona .hints .ThreadHints ;
71- import org .reaktivity .nukleus .AgentBuilder ;
7270import org .reaktivity .nukleus .Elektron ;
7371import org .reaktivity .nukleus .Nukleus ;
7472import org .reaktivity .nukleus .budget .BudgetDebitor ;
9492import org .reaktivity .reaktor .internal .layouts .BufferPoolLayout ;
9593import org .reaktivity .reaktor .internal .layouts .MetricsLayout ;
9694import org .reaktivity .reaktor .internal .layouts .StreamsLayout ;
95+ import org .reaktivity .reaktor .internal .poller .Poller ;
9796import org .reaktivity .reaktor .internal .router .Resolver ;
9897import org .reaktivity .reaktor .internal .router .StreamId ;
9998import org .reaktivity .reaktor .internal .router .Target ;
@@ -174,6 +173,7 @@ public class ElektronAgent implements Agent
174173 private final Long2ObjectHashMap <Address > addressesByRouteId ;
175174
176175 private final RouteManager resolver ;
176+ private final Poller poller ;
177177
178178 private final DefaultBudgetCreditor creditor ;
179179 private final Int2ObjectHashMap <DefaultBudgetDebitor > debitorsByIndex ;
@@ -193,20 +193,16 @@ public class ElektronAgent implements Agent
193193 private long traceId ;
194194 private long budgetId ;
195195
196- private volatile Agent [] agents ;
197-
198196 private long lastReadStreamId ;
199197
200-
201198 public ElektronAgent (
202199 int index ,
203200 int count ,
204201 ReaktorConfiguration config ,
205202 LabelManager labels ,
206203 ExecutorService executorService ,
207204 Function <String , BitSet > affinityMask ,
208- Supplier <DirectBuffer > routesBufferRef ,
209- Supplier <AgentBuilder > supplyAgentBuilder )
205+ Supplier <DirectBuffer > routesBufferRef )
210206 {
211207 this .reaktorTypeId = labels .supplyLabelId (config .name ());
212208 this .localIndex = index ;
@@ -267,14 +263,14 @@ public ElektronAgent(
267263 this .affinityByRemoteId = new Long2ObjectHashMap <>();
268264 this .targetsByIndex = new Int2ObjectHashMap <>();
269265 this .writersByIndex = new Int2ObjectHashMap <>();
270- this .agents = new Agent [0 ];
271266
272267 this .timerWheel = new DeadlineTimerWheel (MILLISECONDS , currentTimeMillis (), 512 , 1024 );
273268 this .tasksByTimerId = new Long2ObjectHashMap <>();
274269 this .futuresById = new Long2ObjectHashMap <>();
275270 this .signaler = new ElektronSignaler (executorService );
276271
277272 this .resolver = new ResolverRef (this ::newResolver );
273+ this .poller = new Poller ();
278274
279275 final BufferPool bufferPool = bufferPoolLayout .bufferPool ();
280276
@@ -299,25 +295,6 @@ public ElektronAgent(
299295 this .creditor = new DefaultBudgetCreditor (index , budgetsLayout , this ::doSystemFlush , this ::supplyBudgetId ,
300296 signaler ::executeTaskAt , config .childCleanupLingerMillis ());
301297 this .debitorsByIndex = new Int2ObjectHashMap <DefaultBudgetDebitor >();
302-
303- if (supplyAgentBuilder != null )
304- {
305- final AgentBuilder agentBuilder = supplyAgentBuilder .get ();
306- final Agent agent = agentBuilder
307- .setRouteManager (resolver )
308- .setWriteBuffer (writeBuffer )
309- .setAddressIdSupplier (labels ::supplyLabelId )
310- .setStreamFactorySupplier (this ::supplyStreamFactory )
311- .setThrottleSupplier (this ::supplyThrottle )
312- .setThrottleRemover (this ::removeThrottle )
313- .setInitialIdSupplier (this ::supplyInitialId )
314- .setReplyIdSupplier (this ::supplyReplyId )
315- .setTraceIdSupplier (this ::supplyTraceId )
316- .setGroupIdSupplier (this ::supplyBudgetId )
317- .setBufferPool (bufferPool )
318- .build ();
319- this .agents = ArrayUtil .add (agents , agent );
320- }
321298 }
322299
323300 private void onSystemMessage (
@@ -575,10 +552,7 @@ public int doWork() throws Exception
575552
576553 try
577554 {
578- for (final Agent agent : agents )
579- {
580- workDone += agent .doWork ();
581- }
555+ workDone += poller .doWork ();
582556
583557 if (timerWheel .timerCount () != 0L )
584558 {
@@ -621,10 +595,7 @@ public void onClose()
621595 ThreadHints .onSpinWait ();
622596 }
623597
624- for (final Agent agent : agents )
625- {
626- agent .onClose ();
627- }
598+ poller .onClose ();
628599
629600 int acquiredBuffers = 0 ;
630601 int acquiredCreditors = 0 ;
@@ -1317,6 +1288,7 @@ private ElektronRef(
13171288 Elektron elekron )
13181289 {
13191290 this .elektron = requireNonNull (elekron );
1291+ this .elektron .setPollerKeySupplier (poller ::register );
13201292
13211293 final Map <RouteKind , StreamFactory > streamFactories = new EnumMap <>(RouteKind .class );
13221294 final Map <RouteKind , AddressFactory > addressFactories = new EnumMap <>(RouteKind .class );
@@ -1357,15 +1329,6 @@ public ElektronRef assign(
13571329 {
13581330 synchronized (this )
13591331 {
1360- if (this .count == 0 )
1361- {
1362- final Agent agent = elektron .agent ();
1363- if (agent != null )
1364- {
1365- agents = ArrayUtil .add (agents , agent );
1366- }
1367- }
1368-
13691332 final StreamFactory streamFactory = streamFactories .get (routeKind );
13701333 if (streamFactory != null )
13711334 {
@@ -1389,31 +1352,6 @@ public ElektronRef unassign(
13891352 {
13901353 final StreamFactory streamFactory = streamFactoriesByAddressId .remove (labelId );
13911354 assert streamFactory == streamFactories .get (routeKind );
1392-
1393- final Agent agent = elektron .agent ();
1394- if (agent != null )
1395- {
1396- // TODO: quiesce streams first
1397- agents = ArrayUtil .remove (agents , agent );
1398- final Agent closeAgent = new Agent ()
1399- {
1400-
1401- @ Override
1402- public int doWork () throws Exception
1403- {
1404- quietClose (agent ::onClose );
1405- agents = ArrayUtil .remove (agents , this );
1406- return 1 ;
1407- }
1408-
1409- @ Override
1410- public String roleName ()
1411- {
1412- return String .format ("%s (deferred close)" , agent .roleName ());
1413- }
1414- };
1415- agents = ArrayUtil .add (agents , closeAgent );
1416- }
14171355 }
14181356 }
14191357
@@ -1457,31 +1395,10 @@ private StreamFactory newStreamFactory(
14571395 .setDroppedFrameConsumer (this ::handleDroppedReadFrame )
14581396 .setRemoteIndexSupplier (StreamId ::remoteIndex )
14591397 .setHostResolver (resolveHost )
1398+ .setPollerKeySupplier (poller ::register )
14601399 .build ();
14611400 }
14621401
1463- private StreamFactory supplyStreamFactory (
1464- int addressId )
1465- {
1466- return streamFactoriesByAddressId .get (addressId );
1467- }
1468-
1469- private MessageConsumer supplyThrottle (
1470- long streamId )
1471- {
1472- final int instanceId = instanceId (streamId );
1473- final Int2ObjectHashMap <MessageConsumer > dispatcher = throttles [throttleIndex (streamId )];
1474- return dispatcher .get (instanceId );
1475- }
1476-
1477- private void removeThrottle (
1478- long streamId )
1479- {
1480- final int instanceId = instanceId (streamId );
1481- final Int2ObjectHashMap <MessageConsumer > dispatcher = throttles [throttleIndex (streamId )];
1482- dispatcher .remove (instanceId );
1483- }
1484-
14851402 private long supplyInitialId (
14861403 long routeId )
14871404 {
0 commit comments