From 1341a2f8d51c22a5e7f11459301ab330f61476e2 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Wed, 10 Jul 2024 15:31:05 -0500 Subject: [PATCH] Add simpler SharedMemory creation methods There are only two cases: create or attach. --- src/main/java/org/apposed/appose/NDArray.java | 2 +- .../java/org/apposed/appose/SharedMemory.java | 27 ++++++++++++++++--- src/main/java/org/apposed/appose/Types.java | 2 +- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apposed/appose/NDArray.java b/src/main/java/org/apposed/appose/NDArray.java index 61b21cb..5bcc956 100644 --- a/src/main/java/org/apposed/appose/NDArray.java +++ b/src/main/java/org/apposed/appose/NDArray.java @@ -76,7 +76,7 @@ public NDArray(final SharedMemory sharedMemory, final DType dType, final Shape s * @param shape array shape */ public NDArray(final DType dType, final Shape shape) { - this(SharedMemory.create(null, true, + this(SharedMemory.create(null, safeInt(shape.numElements() * dType.bytesPerElement())), dType, shape); } diff --git a/src/main/java/org/apposed/appose/SharedMemory.java b/src/main/java/org/apposed/appose/SharedMemory.java index 9a8a841..d68d13b 100644 --- a/src/main/java/org/apposed/appose/SharedMemory.java +++ b/src/main/java/org/apposed/appose/SharedMemory.java @@ -42,6 +42,28 @@ */ public interface SharedMemory extends AutoCloseable { + /** + * Creates a new shared memory block. + * + * @param name the unique name for the requested shared memory, specified + * as a string. If {@code null} is supplied for the name, a novel + * name will be generated. + * @param size size in bytes. + */ + static SharedMemory create(String name, int size) { + return createOrAttach(name, true, size); + } + + /** + * Attaches to an existing shared memory block. + * + * @param name the unique name for the requested shared memory, specified + * as a string. + */ + static SharedMemory attach(String name, int size) { + return createOrAttach(name, false, size); + } + /** * Creates a new shared memory block or attaches to an existing shared * memory block. @@ -52,9 +74,9 @@ public interface SharedMemory extends AutoCloseable { * name will be generated. * @param create whether a new shared memory block is created ({@code true}) * or an existing one is attached to ({@code false}). - * @param size size in bytes + * @param size size in bytes, or 0 if create==false */ - static SharedMemory create(String name, boolean create, int size) { + static SharedMemory createOrAttach(String name, boolean create, int size) { if (size < 0) { throw new IllegalArgumentException("'size' must be a positive integer"); } @@ -64,7 +86,6 @@ static SharedMemory create(String name, boolean create, int size) { if (!create && name == null) { throw new IllegalArgumentException("'name' can only be null if create=true"); } - ServiceLoader loader = ServiceLoader.load(ShmFactory.class); for (ShmFactory factory: loader) { SharedMemory shm = factory.create(name, create, size); diff --git a/src/main/java/org/apposed/appose/Types.java b/src/main/java/org/apposed/appose/Types.java index 2b495f8..4a869ef 100644 --- a/src/main/java/org/apposed/appose/Types.java +++ b/src/main/java/org/apposed/appose/Types.java @@ -161,7 +161,7 @@ private static Object processValue(Object value) { case "shm": final String name = (String) map.get("name"); final int size = (int) map.get("size"); - return SharedMemory.create(name, false, size); + return SharedMemory.attach(name, size); case "ndarray": final SharedMemory shm = (SharedMemory) map.get("shm"); final DType dType = toDType((String) map.get("dtype"));