From 3b3a0da33b23b9faf02f6aaf4ecebad8a50411ee Mon Sep 17 00:00:00 2001 From: Jakob Hoellerbauer Date: Tue, 7 Oct 2025 14:05:20 -0400 Subject: [PATCH 1/3] Optionally try to load libzmq in java --- zcm/java/zcm/zcm/ZCMNativeLoader.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/zcm/java/zcm/zcm/ZCMNativeLoader.java b/zcm/java/zcm/zcm/ZCMNativeLoader.java index a8223c7a..69b2598c 100644 --- a/zcm/java/zcm/zcm/ZCMNativeLoader.java +++ b/zcm/java/zcm/zcm/ZCMNativeLoader.java @@ -25,6 +25,11 @@ public static void loadLibrary() { if (!isLoaded) { synchronized (lock) { if (!isLoaded) { + try { + System.loadLibrary("zmq"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Could not find libzmq : "+e); + } try { System.loadLibrary("zcm"); } catch (UnsatisfiedLinkError e) { From 4a156721fcfcb9d34b5f4f29a0a062aa0f88e5d8 Mon Sep 17 00:00:00 2001 From: Jakob Hoellerbauer Date: Tue, 7 Oct 2025 18:14:09 -0400 Subject: [PATCH 2/3] Make base directory for zmq sockets configurable --- zcm/transport/transport_zmq_local.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/zcm/transport/transport_zmq_local.cpp b/zcm/transport/transport_zmq_local.cpp index 71e812ce..a4e19f58 100644 --- a/zcm/transport/transport_zmq_local.cpp +++ b/zcm/transport/transport_zmq_local.cpp @@ -60,6 +60,7 @@ struct ZCM_TRANS_CLASSNAME : public zcm_trans_t string subnet; int pubhwm = 1000, subhwm = 1000; uint64_t rescanPeriodUs = 250e3; + string baseDir; unordered_map> pubsocks; // socket pair contains the socket + whether it was subscribed to explicitly or not @@ -101,13 +102,24 @@ struct ZCM_TRANS_CLASSNAME : public zcm_trans_t auto* subhwmStr = findOption("subhwm"); if (subhwmStr) subhwm = atoi(subhwmStr->c_str()); + auto* baseDirStr = findOption("base_dir"); + if (baseDirStr) { + baseDir = *baseDirStr; + } else { + baseDir = "/tmp"; + } + auto* rescanPeriodUsStr = findOption("rescan_period_us"); if (rescanPeriodUsStr) rescanPeriodUs = atoi(rescanPeriodUsStr->c_str()); subnet = zcm_url_address(url); + string fullPath = string(baseDir + "/" + subnet); // Make directory with all permissions - mkdir(string("/tmp/" + subnet).c_str(), S_IRWXO | S_IRWXG | S_IRWXU); + int ret = mkdir(fullPath.c_str(), S_IRWXO | S_IRWXG | S_IRWXU); + if (ret < 0 && errno != EEXIST) { + ZCM_DEBUG("Subnet directory creation failed! Could not create %s: %s", fullPath.c_str(), strerror(errno)); + } ZCM_DEBUG("ZMQ Subnet Address: %s\n", subnet.c_str()); @@ -178,7 +190,7 @@ struct ZCM_TRANS_CLASSNAME : public zcm_trans_t { switch (type) { case IPC: - return "ipc:///tmp/" + subnet + "/" + IPC_NAME_PREFIX + channel; + return "ipc://" + baseDir + "/" + subnet + "/" + IPC_NAME_PREFIX + channel; case INPROC: return "inproc://" + subnet + "/" + IPC_NAME_PREFIX + channel; } @@ -286,7 +298,7 @@ struct ZCM_TRANS_CLASSNAME : public zcm_trans_t DIR *d; dirent *ent; - if (!(d=opendir(string("/tmp/" + subnet).c_str()))) + if (!(d=opendir(string(baseDir + "/" + subnet).c_str()))) return; while ((ent=readdir(d)) != nullptr) { @@ -542,7 +554,7 @@ static zcm_trans_t *createInproc(zcm_url_t *url, char **opt_errmsg) const TransportRegister ZCM_TRANS_CLASSNAME::regIpc( "ipc", "Transfer data via Inter-process Communication " "(e.g. 'ipc' or " - "'ipc://?rescan_period_us=250000')", + "'ipc://?rescan_period_us=250000?base_dir=/tmp')", createIpc); #endif From f4de30f4e3e56cc8d75d066f81ecb5cdb1c1dd61 Mon Sep 17 00:00:00 2001 From: Jakob Hoellerbauer Date: Wed, 8 Oct 2025 11:45:32 -0400 Subject: [PATCH 3/3] Reviewed --- zcm/java/zcm/zcm/ZCMNativeLoader.java | 4 +--- zcm/transport/transport_zmq_local.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/zcm/java/zcm/zcm/ZCMNativeLoader.java b/zcm/java/zcm/zcm/ZCMNativeLoader.java index 69b2598c..afb4dc94 100644 --- a/zcm/java/zcm/zcm/ZCMNativeLoader.java +++ b/zcm/java/zcm/zcm/ZCMNativeLoader.java @@ -27,9 +27,7 @@ public static void loadLibrary() { if (!isLoaded) { try { System.loadLibrary("zmq"); - } catch (UnsatisfiedLinkError e) { - System.err.println("Could not find libzmq : "+e); - } + } catch (UnsatisfiedLinkError e) {} try { System.loadLibrary("zcm"); } catch (UnsatisfiedLinkError e) { diff --git a/zcm/transport/transport_zmq_local.cpp b/zcm/transport/transport_zmq_local.cpp index a4e19f58..b02516dc 100644 --- a/zcm/transport/transport_zmq_local.cpp +++ b/zcm/transport/transport_zmq_local.cpp @@ -118,7 +118,9 @@ struct ZCM_TRANS_CLASSNAME : public zcm_trans_t // Make directory with all permissions int ret = mkdir(fullPath.c_str(), S_IRWXO | S_IRWXG | S_IRWXU); if (ret < 0 && errno != EEXIST) { - ZCM_DEBUG("Subnet directory creation failed! Could not create %s: %s", fullPath.c_str(), strerror(errno)); + ZCM_DEBUG("Subnet directory creation failed! Could not create %s: %s", + fullPath.c_str(), strerror(errno)); + assert(false && "ZMQ dir creation failed"); } ZCM_DEBUG("ZMQ Subnet Address: %s\n", subnet.c_str()); @@ -554,7 +556,7 @@ static zcm_trans_t *createInproc(zcm_url_t *url, char **opt_errmsg) const TransportRegister ZCM_TRANS_CLASSNAME::regIpc( "ipc", "Transfer data via Inter-process Communication " "(e.g. 'ipc' or " - "'ipc://?rescan_period_us=250000?base_dir=/tmp')", + "'ipc://?rescan_period_us=250000&base_dir=/tmp')", createIpc); #endif