/** * Construct a media driver with the given context. * * @param context for the media driver parameters */ private MediaDriver(final Context context) { this.ctx = context; ensureDirectoryIsRecreated(context); validateSufficientSocketBufferLengths(context); context .toConductorFromReceiverCommandQueue(new OneToOneConcurrentArrayQueue<>(CMD_QUEUE_CAPACITY)) .toConductorFromSenderCommandQueue(new OneToOneConcurrentArrayQueue<>(CMD_QUEUE_CAPACITY)) .receiverCommandQueue(new OneToOneConcurrentArrayQueue<>(CMD_QUEUE_CAPACITY)) .senderCommandQueue(new OneToOneConcurrentArrayQueue<>(CMD_QUEUE_CAPACITY)) .conclude(); final Receiver receiver = new Receiver(context); final Sender sender = new Sender(context); final DriverConductor conductor = new DriverConductor(context); context.receiverProxy().receiver(receiver); context.senderProxy().sender(sender); context.fromReceiverDriverConductorProxy().driverConductor(conductor); context.fromSenderDriverConductorProxy().driverConductor(conductor); context.toDriverCommands().consumerHeartbeatTime(context.epochClock().time()); final AtomicCounter errorCounter = context.systemCounters().errors(); final ErrorHandler errorHandler = context.errorHandler(); switch (context.threadingMode) { case SHARED: runners = Collections.singletonList( new AgentRunner( context.sharedIdleStrategy, errorHandler, errorCounter, new CompositeAgent(sender, receiver, conductor))); break; case SHARED_NETWORK: runners = Arrays.asList( new AgentRunner( context.sharedNetworkIdleStrategy, errorHandler, errorCounter, new CompositeAgent(sender, receiver)), new AgentRunner( context.conductorIdleStrategy, errorHandler, errorCounter, conductor)); break; default: case DEDICATED: runners = Arrays.asList( new AgentRunner(context.senderIdleStrategy, errorHandler, errorCounter, sender), new AgentRunner(context.receiverIdleStrategy, errorHandler, errorCounter, receiver), new AgentRunner( context.conductorIdleStrategy, errorHandler, errorCounter, conductor)); } }