void preparePvWriter(boolean syncWrite) { // Create PVReader and connect pvWriter = new PVWriterImpl<>(syncWrite, localThread() == notificationExecutor); for (PVWriterListener<T> pVWriterListener : writeListeners) { pvWriter.addPVWriterListener(pVWriterListener); } writeFunction = writeExpression.getWriteFunction(); }
@Override public void run() { try { pv.setLastWriteException(lastException); pv.setWriteConnected(connected); pv.firePvWritten(); } finally { notificationInFlight = false; scanStrategy.readyForNextEvent(); } } });
/** * Adds a listener to the value. This method is thread safe. * * @param listener a new listener */ @Override public void addPVWriterListener(PVWriterListener<? extends T> listener) { if (isClosed()) { throw new IllegalStateException("Can't add listeners to a closed PV"); } @SuppressWarnings("unchecked") PVWriterListener<T> convertedListener = (PVWriterListener<T>) listener; pvWriterListeners.add(convertedListener); }
/** * Creates the pv such that writes are asynchronous and read notifications * comes at most at the rate specified. * * @param period minimum time between read notifications * @return a new PV */ public PV<R, W> asynchWriteAndMaxReadRate(Duration period) { PVReader<R> pvReader = pvReaderConfiguration.maxRate(period); PVWriter<W> pvWriter = pvWriterConfiguration.async(); PV<R, W> pv = new PV<R, W>(pvReader, pvWriter); // XXX: This should really be set before the scanning starts PVReaderImpl.implOf(pvReader).setReaderForNotification(pv); PVWriterImpl.implOf(pvWriter).setWriterForNotification(pv); return pv; }
void fireWriteFailure(Exception ex) { setLastWriteException(ex); PVWriterEvent<T> event; synchronized(lock) { event = new PVWriterEvent<>(PVWriterEvent.WRITE_FAILED_MASK, writerForNotification); } for (PVWriterListener<T> listener : pvWriterListeners) { listener.pvChanged(event); } }
if (pv == null || (pv.isWriteConnected() == connected && lastException == null)) { scanStrategy.readyForNextEvent(); return;
static <T> PVWriterDirector<T> prepareDirector(PVWriterConfiguration<T> writerConfiguration) { PVWriterDirector<T> writerDirector = new PVWriterDirector<T>(writerConfiguration.pvWriter, writerConfiguration.writeFunction, writerConfiguration.dataSource, PVManager.getAsyncWriteExecutor(), writerConfiguration.notificationExecutor, PVManager.getReadScannerExecutorService(), writerConfiguration.timeout, writerConfiguration.timeoutMessage, writerConfiguration.exceptionHandler); writerDirector.connectExpression(writerConfiguration.writeExpression); writerConfiguration.pvWriter.setWriteDirector(writerDirector); return writerDirector; }