log: set distinct thread names to enhance logging of race conditions

This commit is contained in:
Thomas Kuehne
2025-06-22 17:21:32 +02:00
parent 2e8c38d255
commit 168fec3253
12 changed files with 47 additions and 12 deletions
@@ -31,6 +31,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicLong;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
@@ -50,6 +51,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper;
*/
public final class GBScanEventProcessor implements Runnable {
private static final Logger LOG = LoggerFactory.getLogger(GBScanEventProcessor.class);
private static final AtomicLong THREAD_COUNTER = new AtomicLong(0L);
private static final ParcelUuid ZERO_UUID = ParcelUuid.fromString("00000000-0000-0000-0000-000000000000");
@@ -97,7 +99,7 @@ public final class GBScanEventProcessor implements Runnable {
}
running = true;
thread = new Thread("Gadgetbridge Device Found Processor Thread") {
thread = new Thread("GBScanEventProcessor_" + THREAD_COUNTER.getAndIncrement()) {
@Override
public void run() {
GBScanEventProcessor.this.run();
@@ -41,6 +41,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity;
@@ -50,6 +51,8 @@ import nodomain.freeyourgadget.gadgetbridge.util.GB;
import static android.view.View.GONE;
public class QHybridAppChoserActivity extends AbstractGBActivity {
private static final AtomicLong THREAD_COUNTER = new AtomicLong(0L);
boolean hasControl = false;
private PackageConfigHelper helper;
@@ -91,7 +94,7 @@ public class QHybridAppChoserActivity extends AbstractGBActivity {
}
});
}
}).start();
}, "QHybridAppChoserActivity_" + THREAD_COUNTER.getAndIncrement()).start();
appList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
@@ -35,6 +35,7 @@ import java.io.IOException;
import java.util.Arrays;
import java.util.Locale;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLong;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
@@ -43,6 +44,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.GB;
public final class BtBRQueue {
private static final Logger LOG = LoggerFactory.getLogger(BtBRQueue.class);
private static final AtomicLong THREAD_COUNTER = new AtomicLong(0L);
public static final int HANDLER_SUBJECT_CONNECT = 0;
public static final int HANDLER_SUBJECT_PERFORM_TRANSACTION = 1;
@@ -58,9 +60,9 @@ public final class BtBRQueue {
private final int mBufferSize;
private final Handler mWriteHandler;
private final HandlerThread mWriteHandlerThread = new HandlerThread("Write Thread", Process.THREAD_PRIORITY_BACKGROUND);
private final HandlerThread mWriteHandlerThread = new HandlerThread("BtBRQueue_write_" + THREAD_COUNTER.getAndIncrement(), Process.THREAD_PRIORITY_BACKGROUND);
private Thread readThread = new Thread("Read Thread") {
private Thread readThread = new Thread("BtBRQueue_read_" + THREAD_COUNTER.getAndIncrement()) {
@Override
public void run() {
final byte[] buffer = new byte[mBufferSize];
@@ -47,6 +47,7 @@ import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicLong;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.Logging;
@@ -62,6 +63,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.WriteAction;
public final class BtLEQueue {
private static final Logger LOG = LoggerFactory.getLogger(BtLEQueue.class);
private static final byte[] EMPTY = new byte[0];
private static final AtomicLong THREAD_COUNTER = new AtomicLong(0L);
private final Object mGattMonitor;
private final GBDevice mGbDevice;
@@ -88,7 +90,7 @@ public final class BtLEQueue {
private final boolean mImplicitGattCallbackModify;
private final boolean mSendWriteRequestResponse;
private Thread dispatchThread = new Thread("Gadgetbridge GATT Dispatcher") {
private Thread dispatchThread = new Thread("BtLEQueue_" + THREAD_COUNTER.getAndIncrement()) {
@Override
public void run() {
@@ -28,6 +28,7 @@ import androidx.core.content.ContextCompat;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLong;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
@@ -47,6 +48,8 @@ import nodomain.freeyourgadget.gadgetbridge.util.protobuf.messagefields.StringMe
import nodomain.freeyourgadget.gadgetbridge.util.protobuf.messagefields.VarintMessageField;
public class FlipperZeroSupport extends FlipperZeroBaseSupport{
private static final AtomicLong THREAD_COUNTER = new AtomicLong(0L);
private BatteryInfoProfile batteryInfoProfile = new BatteryInfoProfile(this);
private final String UUID_SERIAL_SERVICE = "8fe5b3d5-2e7f-4a98-2a48-7acc60fe0000";
@@ -74,7 +77,7 @@ public class FlipperZeroSupport extends FlipperZeroBaseSupport{
handlePlaySubGHZ(intent);
}
}
}).start();
}, "FlipperZeroSupport_" + THREAD_COUNTER.getAndIncrement()).start();
}
};
boolean recevierRegistered = false;
@@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
@@ -17,6 +18,7 @@ import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
public class FitAsyncProcessor {
private static final Logger LOG = LoggerFactory.getLogger(FitAsyncProcessor.class);
private static final AtomicLong THREAD_COUNTER = new AtomicLong(0L);
private final Context context;
private final GBDevice gbDevice;
@@ -67,7 +69,7 @@ public class FitAsyncProcessor {
}
FitAsyncProcessor.this.handler.post(callback::onFinish);
}).start();
}, "FitAsyncProcessor_" + THREAD_COUNTER.getAndIncrement()).start();
}
public interface Callback {
@@ -36,6 +36,7 @@ import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@@ -58,6 +59,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.UriHelper;
public class HuaweiOTAManager {
private static final Logger LOG = LoggerFactory.getLogger(HuaweiOTAManager.class);
private static final AtomicLong THREAD_COUNTER = new AtomicLong(0L);
public static class UploadInfo {
public int waitTimeout;
@@ -279,7 +281,7 @@ public class HuaweiOTAManager {
sendMessage(3, null);
}
}
}).start();
}, "HuaweiOTAManager_" + THREAD_COUNTER.getAndIncrement()).start();
}
private short calculateFwFileId() throws Exception {
@@ -18,6 +18,7 @@ import java.nio.ByteOrder;
import java.util.HashMap;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLong;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
@@ -30,6 +31,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.idasen.IdasenConstants;
public class IdasenDeviceSupport extends AbstractBTLESingleDeviceSupport {
private static final Logger LOG = LoggerFactory.getLogger(IdasenDeviceSupport.class);
private static final AtomicLong THREAD_COUNTER = new AtomicLong(0L);
public static final String COMMAND_UP = "nodomain.freeyourgadget.gadgetbridge.idasen.command.UP";
public static final String COMMAND_DOWN = "nodomain.freeyourgadget.gadgetbridge.idasen.command.DOWN";
@@ -108,7 +110,7 @@ public class IdasenDeviceSupport extends AbstractBTLESingleDeviceSupport {
if (cutOff == 0) {
LOG.warn("desk controller did not reach the desired height in time");
}
}).start();
}, "IdasenDeviceSupport_" + THREAD_COUNTER.getAndIncrement()).start();
break;
}
}
@@ -27,12 +27,15 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.concurrent.atomic.AtomicLong;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
public class PebbleLESupport {
private static final Logger LOG = LoggerFactory.getLogger(PebbleLESupport.class);
private static final AtomicLong THREAD_COUNTER = new AtomicLong(0L);
private final GBDevice mgbDevice;
private final BluetoothDevice mBtDevice;
private PipeReader mPipeReader;
@@ -59,7 +62,7 @@ public class PebbleLESupport {
LOG.warn("could not connect input stream");
}
mWriteHandlerThread = new HandlerThread("write handler thread");
mWriteHandlerThread = new HandlerThread("PebbleLESupport_write_" + THREAD_COUNTER.getAndIncrement());
mWriteHandlerThread.start();
mWriteHandler = new Handler(mWriteHandlerThread.getLooper());
@@ -201,6 +204,10 @@ public class PebbleLESupport {
private class PipeReader extends Thread {
int mmSequence = 0;
PipeReader(){
super("PebbleLESupport_read_" + THREAD_COUNTER.getAndIncrement());
}
@Override
public void run() {
byte[] buf = new byte[8192];
@@ -46,6 +46,7 @@ import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLong;
import nodomain.freeyourgadget.gadgetbridge.BuildConfig;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
@@ -94,6 +95,8 @@ import nodomain.freeyourgadget.gadgetbridge.util.GB;
import nodomain.freeyourgadget.gadgetbridge.util.UriHelper;
public class FossilWatchAdapter extends WatchAdapter {
private static final AtomicLong THREAD_COUNTER = new AtomicLong(0L);
private ArrayList<Request> requestQueue = new ArrayList<>();
protected FossilRequest fossilRequest;
@@ -130,7 +133,7 @@ public class FossilWatchAdapter extends WatchAdapter {
timeoutHandler = new Handler(timeoutLooper);
Looper.loop();
}
});
}, "FossilWatchAdapter_" + THREAD_COUNTER.getAndIncrement());
private Runnable requestTimeoutRunnable = new Runnable() {
@Override
@@ -38,6 +38,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLong;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventUpdatePreferences;
@@ -77,6 +78,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
public class XiaomiSupport extends AbstractDeviceSupport {
private static final Logger LOG = LoggerFactory.getLogger(XiaomiSupport.class);
private static final AtomicLong THREAD_COUNTER = new AtomicLong(0L);
private final XiaomiAuthService authService = new XiaomiAuthService(this);
private final XiaomiMusicService musicService = new XiaomiMusicService(this);
@@ -552,7 +554,7 @@ public class XiaomiSupport extends AbstractDeviceSupport {
GB.updateTransferNotification("", "", false, 100, getContext());
GB.signalActivityDataFinish(getDevice());
});
}).start();
}, "XiaomiSupport_" + THREAD_COUNTER.getAndIncrement()).start();
}
public void setFeatureSupported(final String featureKey, final boolean supported) {
@@ -18,13 +18,18 @@ package nodomain.freeyourgadget.gadgetbridge.service.serial;
import android.content.Context;
import java.util.concurrent.atomic.AtomicLong;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
public abstract class GBDeviceIoThread extends Thread {
private static final AtomicLong THREAD_COUNTER = new AtomicLong(0L);
protected final GBDevice gbDevice;
private final Context context;
public GBDeviceIoThread(GBDevice gbDevice, Context context) {
super("GBDeviceIoThread_" + THREAD_COUNTER.getAndIncrement());
this.gbDevice = gbDevice;
this.context = context;
}