diff --git a/copyparty/broker_mp.py b/copyparty/broker_mp.py index c0bbd8b1..52cc9f96 100644 --- a/copyparty/broker_mp.py +++ b/copyparty/broker_mp.py @@ -44,7 +44,9 @@ class BrokerMp(object): proc.clients = {} proc.workload = 0 - thr = threading.Thread(target=self.collector, args=(proc,)) + thr = threading.Thread( + target=self.collector, args=(proc,), name="mp-collector" + ) thr.daemon = True thr.start() @@ -52,14 +54,19 @@ class BrokerMp(object): proc.start() if not self.args.q: - thr = threading.Thread(target=self.debug_load_balancer) + thr = threading.Thread( + target=self.debug_load_balancer, name="mp-dbg-loadbalancer" + ) thr.daemon = True thr.start() def shutdown(self): self.log("broker", "shutting down") - for proc in self.procs: - thr = threading.Thread(target=proc.q_pend.put([0, "shutdown", []])) + for n, proc in enumerate(self.procs): + thr = threading.Thread( + target=proc.q_pend.put([0, "shutdown", []]), + name="mp-shutdown-{}-{}".format(n, len(self.procs)), + ) thr.start() with self.mutex: diff --git a/copyparty/broker_mpw.py b/copyparty/broker_mpw.py index fdfbbe43..6dd03627 100644 --- a/copyparty/broker_mpw.py +++ b/copyparty/broker_mpw.py @@ -27,7 +27,7 @@ class MpWorker(object): self.retpend = {} self.retpend_mutex = threading.Lock() self.mutex = threading.Lock() - self.workload_thr_active = False + self.workload_thr_alive = False # we inherited signal_handler from parent, # replace it with something harmless @@ -40,7 +40,7 @@ class MpWorker(object): # on winxp and some other platforms, # use thr.join() to block all signals - thr = threading.Thread(target=self.main) + thr = threading.Thread(target=self.main, name="mpw-main") thr.daemon = True thr.start() thr.join() @@ -79,9 +79,11 @@ class MpWorker(object): self.httpsrv.accept(sck, addr) with self.mutex: - if not self.workload_thr_active: + if not self.workload_thr_alive: self.workload_thr_alive = True - thr = threading.Thread(target=self.thr_workload) + thr = threading.Thread( + target=self.thr_workload, name="mpw-workload" + ) thr.daemon = True thr.start() diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index 5bd64b4f..dd80a7b6 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -1378,15 +1378,31 @@ class HttpCli(object): if self.args.no_stack: raise Pebkac(403, "disabled by argv") - ret = [] + threads = {} names = dict([(t.ident, t.name) for t in threading.enumerate()]) for tid, stack in sys._current_frames().items(): - ret.append("\n\n# {} ({:x})".format(names.get(tid), tid)) + name = "{} ({:x})".format(names.get(tid), tid) + threads[name] = stack + + rret = [] + bret = [] + for name, stack in sorted(threads.items()): + ret = ["\n\n# {}".format(name)] + pad = None for fn, lno, name, line in traceback.extract_stack(stack): + fn = os.sep.join(fn.split(os.sep)[-3:]) ret.append('File: "{}", line {}, in {}'.format(fn, lno, name)) if line: ret.append(" " + str(line.strip())) + if "self.not_empty.wait()" in line: + pad = " " * 4 + if pad: + bret += [ret[0]] + [pad + x for x in ret[1:]] + else: + rret += ret + + ret = rret + bret ret = ("
" + "\n".join(ret)).encode("utf-8") self.reply(ret) diff --git a/copyparty/httpsrv.py b/copyparty/httpsrv.py index 356d9c58..6f3375fd 100644 --- a/copyparty/httpsrv.py +++ b/copyparty/httpsrv.py @@ -67,7 +67,11 @@ class HttpSrv(object): if self.args.log_conn: self.log("%s %s" % addr, "|%sC-cthr" % ("-" * 5,), c="1;30") - thr = threading.Thread(target=self.thr_client, args=(sck, addr)) + thr = threading.Thread( + target=self.thr_client, + args=(sck, addr), + name="httpsrv-{}-{}".format(addr[0].split(".", 2)[-1][-6:], addr[1]), + ) thr.daemon = True thr.start() @@ -90,7 +94,9 @@ class HttpSrv(object): self.workload += 50 if not self.workload_thr_alive: self.workload_thr_alive = True - thr = threading.Thread(target=self.thr_workload) + thr = threading.Thread( + target=self.thr_workload, name="httpsrv-workload" + ) thr.daemon = True thr.start() diff --git a/copyparty/star.py b/copyparty/star.py index 621fddd9..e6d3bb73 100644 --- a/copyparty/star.py +++ b/copyparty/star.py @@ -42,7 +42,7 @@ class StreamTar(object): fmt = tarfile.GNU_FORMAT self.tar = tarfile.open(fileobj=self.qfile, mode="w|", format=fmt) - w = threading.Thread(target=self._gen) + w = threading.Thread(target=self._gen, name="star-gen") w.daemon = True w.start() diff --git a/copyparty/svchub.py b/copyparty/svchub.py index 409bbf13..3e123efc 100644 --- a/copyparty/svchub.py +++ b/copyparty/svchub.py @@ -71,7 +71,7 @@ class SvcHub(object): self.broker = Broker(self) def run(self): - thr = threading.Thread(target=self.tcpsrv.run) + thr = threading.Thread(target=self.tcpsrv.run, name="svchub-main") thr.daemon = True thr.start() diff --git a/copyparty/th_srv.py b/copyparty/th_srv.py index 75622a99..27a49e82 100644 --- a/copyparty/th_srv.py +++ b/copyparty/th_srv.py @@ -114,8 +114,10 @@ class ThumbSrv(object): self.stopping = False self.nthr = os.cpu_count() if hasattr(os, "cpu_count") else 4 self.q = Queue(self.nthr * 4) - for _ in range(self.nthr): - t = threading.Thread(target=self.worker) + for n in range(self.nthr): + t = threading.Thread( + target=self.worker, name="thumb-{}-{}".format(n, self.nthr) + ) t.daemon = True t.start() @@ -131,7 +133,7 @@ class ThumbSrv(object): msg += ", ".join(missing) self.log(msg, c=3) - t = threading.Thread(target=self.cleaner) + t = threading.Thread(target=self.cleaner, name="thumb-cleaner") t.daemon = True t.start() diff --git a/copyparty/u2idx.py b/copyparty/u2idx.py index a642f9bd..1e2c3612 100644 --- a/copyparty/u2idx.py +++ b/copyparty/u2idx.py @@ -192,6 +192,7 @@ class U2idx(object): self.active_id, done_flag, ), + name="u2idx-terminator", ) thr.daemon = True thr.start() diff --git a/copyparty/up2k.py b/copyparty/up2k.py index 42ba849f..21510441 100644 --- a/copyparty/up2k.py +++ b/copyparty/up2k.py @@ -83,7 +83,7 @@ class Up2k(object): if ANYWIN: # usually fails to set lastmod too quickly self.lastmod_q = Queue() - thr = threading.Thread(target=self._lastmodder) + thr = threading.Thread(target=self._lastmodder, name="up2k-lastmod") thr.daemon = True thr.start() @@ -96,7 +96,9 @@ class Up2k(object): if self.args.no_fastboot: self.deferred_init(all_vols) else: - t = threading.Thread(target=self.deferred_init, args=(all_vols,)) + t = threading.Thread( + target=self.deferred_init, args=(all_vols,), name="up2k-deferred-init" + ) t.daemon = True t.start() @@ -104,20 +106,20 @@ class Up2k(object): have_e2d = self.init_indexes(all_vols) if have_e2d: - thr = threading.Thread(target=self._snapshot) + thr = threading.Thread(target=self._snapshot, name="up2k-snapshot") thr.daemon = True thr.start() - thr = threading.Thread(target=self._hasher) + thr = threading.Thread(target=self._hasher, name="up2k-hasher") thr.daemon = True thr.start() if self.mtag: - thr = threading.Thread(target=self._tagger) + thr = threading.Thread(target=self._tagger, name="up2k-tagger") thr.daemon = True thr.start() - thr = threading.Thread(target=self._run_all_mtp) + thr = threading.Thread(target=self._run_all_mtp, name="up2k-mtp-init") thr.daemon = True thr.start() @@ -132,7 +134,11 @@ class Up2k(object): return "cannot initiate; scan is already in progress" args = (all_vols, scan_vols) - t = threading.Thread(target=self.init_indexes, args=args) + t = threading.Thread( + target=self.init_indexes, + args=args, + name="up2k-rescan-{}".format(scan_vols[0]), + ) t.daemon = True t.start() return None @@ -273,7 +279,7 @@ class Up2k(object): if self.mtag: m = "online (running mtp)" if scan_vols: - thr = threading.Thread(target=self._run_all_mtp) + thr = threading.Thread(target=self._run_all_mtp, name="up2k-mtp-scan") thr.daemon = True else: del self.pp @@ -758,7 +764,9 @@ class Up2k(object): mpool = Queue(nw) for _ in range(nw): - thr = threading.Thread(target=self._tag_thr, args=(mpool,)) + thr = threading.Thread( + target=self._tag_thr, args=(mpool,), name="up2k-mpool" + ) thr.daemon = True thr.start() diff --git a/copyparty/util.py b/copyparty/util.py index 17b91203..9b714c12 100644 --- a/copyparty/util.py +++ b/copyparty/util.py @@ -193,7 +193,7 @@ class ProgressPrinter(threading.Thread): """ def __init__(self): - threading.Thread.__init__(self) + threading.Thread.__init__(self, name="pp") self.daemon = True self.msg = None self.end = False