mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 17:36:29 +03:00
fix #1720 -- don't wait for the daemon eventhread to terminate but count on it to eventually die
This commit is contained in:
@@ -609,10 +609,14 @@ class Account(object):
|
|||||||
self.log("remove dc_context references")
|
self.log("remove dc_context references")
|
||||||
# the dc_context_unref triggers get_next_event to return ffi.NULL
|
# the dc_context_unref triggers get_next_event to return ffi.NULL
|
||||||
# which in turns makes the event thread finish execution
|
# which in turns makes the event thread finish execution
|
||||||
|
self._event_thread.mark_shutdown()
|
||||||
self._dc_context = None
|
self._dc_context = None
|
||||||
|
|
||||||
self.log("wait for event thread to finish")
|
# the following wait is left out for now because it can fail if
|
||||||
self._event_thread.wait()
|
# a) python code holds an extra self._dc_context reference
|
||||||
|
# b) the core does not manage to send a NULL through get_next_event()
|
||||||
|
# self.log("wait for event thread to finish")
|
||||||
|
# self._event_thread.wait()
|
||||||
|
|
||||||
self._shutdown_event.set()
|
self._shutdown_event.set()
|
||||||
|
|
||||||
|
|||||||
@@ -162,6 +162,10 @@ class DirectImap:
|
|||||||
requested = [b'BODY.PEEK[HEADER]', FLAGS]
|
requested = [b'BODY.PEEK[HEADER]', FLAGS]
|
||||||
for uid, data in self.conn.fetch(messages, requested).items():
|
for uid, data in self.conn.fetch(messages, requested).items():
|
||||||
body_bytes = data[b'BODY[HEADER]']
|
body_bytes = data[b'BODY[HEADER]']
|
||||||
|
if not body_bytes:
|
||||||
|
log("Message", uid, "has empty body")
|
||||||
|
continue
|
||||||
|
|
||||||
flags = data[FLAGS]
|
flags = data[FLAGS]
|
||||||
path = pathlib.Path(str(dir)).joinpath("IMAP", self.logid, imapfolder)
|
path = pathlib.Path(str(dir)).joinpath("IMAP", self.logid, imapfolder)
|
||||||
path.mkdir(parents=True, exist_ok=True)
|
path.mkdir(parents=True, exist_ok=True)
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ class EventThread(threading.Thread):
|
|||||||
self.account = account
|
self.account = account
|
||||||
super(EventThread, self).__init__(name="events")
|
super(EventThread, self).__init__(name="events")
|
||||||
self.setDaemon(True)
|
self.setDaemon(True)
|
||||||
|
self._marked_for_shutdown = False
|
||||||
self.start()
|
self.start()
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
@@ -147,6 +148,9 @@ class EventThread(threading.Thread):
|
|||||||
yield
|
yield
|
||||||
self.account.log(message + " FINISHED")
|
self.account.log(message + " FINISHED")
|
||||||
|
|
||||||
|
def mark_shutdown(self):
|
||||||
|
self._marked_for_shutdown = True
|
||||||
|
|
||||||
def wait(self):
|
def wait(self):
|
||||||
if self == threading.current_thread():
|
if self == threading.current_thread():
|
||||||
# we are in the callback thread and thus cannot
|
# we are in the callback thread and thus cannot
|
||||||
@@ -164,10 +168,12 @@ class EventThread(threading.Thread):
|
|||||||
lib.dc_get_event_emitter(self.account._dc_context),
|
lib.dc_get_event_emitter(self.account._dc_context),
|
||||||
lib.dc_event_emitter_unref,
|
lib.dc_event_emitter_unref,
|
||||||
)
|
)
|
||||||
while 1:
|
while not self._marked_for_shutdown:
|
||||||
event = lib.dc_get_next_event(event_emitter)
|
event = lib.dc_get_next_event(event_emitter)
|
||||||
if event == ffi.NULL:
|
if event == ffi.NULL:
|
||||||
break
|
break
|
||||||
|
if self._marked_for_shutdown:
|
||||||
|
break
|
||||||
evt = lib.dc_event_get_id(event)
|
evt = lib.dc_event_get_id(event)
|
||||||
data1 = lib.dc_event_get_data1_int(event)
|
data1 = lib.dc_event_get_data1_int(event)
|
||||||
# the following code relates to the deltachat/_build.py's helper
|
# the following code relates to the deltachat/_build.py's helper
|
||||||
|
|||||||
Reference in New Issue
Block a user