From e56cee5cab25cb24068a9da0a7ed60d2f246d2d7 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Fri, 24 Nov 2023 16:10:44 +0100 Subject: [PATCH] fix: read sensor from worker thread --- .../java/io/github/metacosm/power/PowerMeasurer.java | 12 +++++++++--- .../macos/powermetrics/MacOSPowermetricsSensor.java | 3 ++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/github/metacosm/power/PowerMeasurer.java b/src/main/java/io/github/metacosm/power/PowerMeasurer.java index 9acb1bd4..de3505e7 100644 --- a/src/main/java/io/github/metacosm/power/PowerMeasurer.java +++ b/src/main/java/io/github/metacosm/power/PowerMeasurer.java @@ -3,11 +3,14 @@ import io.github.metacosm.power.sensors.PowerSensor; import io.github.metacosm.power.sensors.RegisteredPID; import io.smallrye.mutiny.Multi; +import io.smallrye.mutiny.Uni; +import io.smallrye.mutiny.infrastructure.Infrastructure; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import java.time.Duration; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; @ApplicationScoped public class PowerMeasurer { @@ -16,7 +19,7 @@ public class PowerMeasurer { @Inject PowerSensor sensor; - private Multi> stream; + private Multi> periodicSensorCheck; public Multi startTracking(String pid) throws Exception { // first make sure that the process with that pid exists @@ -25,10 +28,13 @@ public Multi startTracking(String pid) throws Exception { if(!sensor.isStarted()) { sensor.start(SAMPLING_FREQUENCY_IN_MILLIS); - stream = Multi.createFrom().ticks().every(Duration.ofMillis(SAMPLING_FREQUENCY_IN_MILLIS)).map(sensor::update); + periodicSensorCheck = Multi.createFrom().ticks() + .every(Duration.ofMillis(SAMPLING_FREQUENCY_IN_MILLIS)) + .emitOn(Infrastructure.getDefaultWorkerPool()) + .map(sensor::update); } final var registeredPID = sensor.register(parsedPID); - return stream.map(registeredPIDMap -> registeredPIDMap.get(registeredPID)) + return periodicSensorCheck.map(registeredPIDMap -> registeredPIDMap.get(registeredPID)) .onCancellation().invoke(() -> sensor.unregister(registeredPID)); } } diff --git a/src/main/java/io/github/metacosm/power/sensors/macos/powermetrics/MacOSPowermetricsSensor.java b/src/main/java/io/github/metacosm/power/sensors/macos/powermetrics/MacOSPowermetricsSensor.java index 1a72c03f..296b3e62 100644 --- a/src/main/java/io/github/metacosm/power/sensors/macos/powermetrics/MacOSPowermetricsSensor.java +++ b/src/main/java/io/github/metacosm/power/sensors/macos/powermetrics/MacOSPowermetricsSensor.java @@ -10,6 +10,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class MacOSPowermetricsSensor implements PowerSensor { public static final String CPU = "cpu"; @@ -21,7 +22,7 @@ public class MacOSPowermetricsSensor implements PowerSensor { private final SensorMetadata.ComponentMetadata gpu = new SensorMetadata.ComponentMetadata(GPU, 1, "GPU power", true, "mW"); private final SensorMetadata.ComponentMetadata ane = new SensorMetadata.ComponentMetadata(ANE, 2, "Apple Neural Engine power", false, "mW"); private final SensorMetadata.ComponentMetadata cpuShare = new SensorMetadata.ComponentMetadata(CPU_SHARE, 3, "Computed share of CPU", false, "decimal percentage"); - private final Map trackedPIDs = new HashMap<>(); + private final Map trackedPIDs = new ConcurrentHashMap<>(); private final SensorMetadata metadata = new SensorMetadata() { @Override