Skip to content

Commit

Permalink
Issue #222: Ensure dbus daemon thread is terminated when close() is c…
Browse files Browse the repository at this point in the history
…alled
  • Loading branch information
hypfvieh committed Jun 29, 2023
1 parent ad54049 commit beda7cf
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 34 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ The library will remain open source and MIT licensed and can still be used, fork
- Updated documentation ([#218](https://github.com/hypfvieh/dbus-java/issues/218))
- Fixed possible issue with used serial numbers in messages because signals may manually incremented the serial without updating global serial ([#220](https://github.com/hypfvieh/dbus-java/issues/220))
- Updated module-info exports, thanks to [brett-smith](https://github.com/brett-smith) ([#221](https://github.com/hypfvieh/dbus-java/issues/221))
- Ensure that DBusDaemonThread is terminated when close() is called, thanks to [brett-smith](https://github.com/brett-smith) ([#222](https://github.com/hypfvieh/dbus-java/issues/222))

##### Changes in 4.3.0 (2023-03-10):

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,52 +2,31 @@

import org.freedesktop.dbus.Marshalling;
import org.freedesktop.dbus.connections.BusAddress;
import org.freedesktop.dbus.connections.transports.AbstractTransport;
import org.freedesktop.dbus.connections.transports.TransportBuilder;
import org.freedesktop.dbus.connections.transports.*;
import org.freedesktop.dbus.connections.transports.TransportBuilder.SaslAuthMode;
import org.freedesktop.dbus.connections.transports.TransportConnection;
import org.freedesktop.dbus.errors.AccessDenied;
import org.freedesktop.dbus.errors.Error;
import org.freedesktop.dbus.errors.MatchRuleInvalid;
import org.freedesktop.dbus.exceptions.DBusException;
import org.freedesktop.dbus.exceptions.DBusExecutionException;
import org.freedesktop.dbus.interfaces.DBus;
import org.freedesktop.dbus.interfaces.*;
import org.freedesktop.dbus.interfaces.DBus.NameOwnerChanged;
import org.freedesktop.dbus.interfaces.FatalException;
import org.freedesktop.dbus.interfaces.Introspectable;
import org.freedesktop.dbus.interfaces.Peer;
import org.freedesktop.dbus.messages.DBusSignal;
import org.freedesktop.dbus.messages.Message;
import org.freedesktop.dbus.messages.MethodCall;
import org.freedesktop.dbus.messages.MethodReturn;
import org.freedesktop.dbus.messages.*;
import org.freedesktop.dbus.types.UInt32;
import org.freedesktop.dbus.types.Variant;
import org.freedesktop.dbus.utils.Hexdump;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.Closeable;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.*;
import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

Expand Down Expand Up @@ -208,7 +187,7 @@ public void close() {
}
}
sender.terminate();
if (transport != null && transport.isConnected()) {
if (transport != null) {
LOGGER.debug("Terminating transport {}", transport);
try {
// shutdown listener
Expand All @@ -217,6 +196,7 @@ public void close() {
LOGGER.debug("Error closing transport", _ex);
}
}
interrupt();
}

private void removeConnection(ConnectionStruct _c) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
package org.freedesktop.dbus.bin;

import org.freedesktop.dbus.connections.BusAddress;
import org.freedesktop.dbus.connections.transports.AbstractTransport;
import org.freedesktop.dbus.connections.transports.TransportBuilder;
import org.freedesktop.dbus.connections.transports.*;
import org.freedesktop.dbus.connections.transports.TransportBuilder.SaslAuthMode;
import org.freedesktop.dbus.connections.transports.TransportConnection;
import org.freedesktop.dbus.exceptions.AuthenticationException;
import org.freedesktop.dbus.exceptions.DBusException;
import org.freedesktop.dbus.exceptions.SocketClosedException;
import org.freedesktop.dbus.exceptions.*;
import org.freedesktop.dbus.utils.Util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -58,6 +54,11 @@ public synchronized void close() throws IOException {
connectionReady.set(false);
if (daemon != null) {
daemon.close();
try {
daemon.join(5000L);
} catch (InterruptedException _ex) {
LOGGER.debug("Interrupted while waiting for daemon thread to terminate");
}
daemon = null;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,5 +79,10 @@ public void testStartStop() throws Exception {
daemon.close();
assertEquals(null, exception.get()); // assertEquals() gives a better error message
}

long dbusDaemonThreadCnt = Thread.getAllStackTraces().keySet().stream()
.filter(e -> e.getName().startsWith(DBusDaemon.class.getSimpleName()))
.count();
assertEquals(0, dbusDaemonThreadCnt, "All dbus daemon threads should have been terminated");
}
}

0 comments on commit beda7cf

Please sign in to comment.