Skip to content

Commit a265da4

Browse files
committed
[FIX] server: add context to event queue.
Language server was not added to the context of the event queue and so was sometimes crashing when a file is edited.
1 parent eebb40c commit a265da4

File tree

2 files changed

+19
-12
lines changed

2 files changed

+19
-12
lines changed

server/odoo_language_server.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@
99
from .update_event_queue import UpdateEventQueue
1010

1111

12+
def _prepare_ctxt_thread(odoo_server, target, args):
13+
OdooLanguageServer.instance.set(odoo_server)
14+
OdooLanguageServer.access_mode.set("none")
15+
target(*args)
16+
17+
1218
class OdooLanguageServer(LanguageServer):
1319

1420
instance = contextvars.ContextVar('instance', default=None)
@@ -26,11 +32,14 @@ def report_server_error(self, error: Exception, source):
2632
odoo_server.send_notification("Odoo/displayCrashNotification", {"crashInfo": traceback.format_exc()})
2733

2834
def launch_thread(self, target, args):
29-
def prepare_ctxt_thread(odoo_server, target, args):
30-
OdooLanguageServer.instance.set(odoo_server)
31-
OdooLanguageServer.access_mode.set("none")
32-
target(*args)
33-
threading.Thread(target=prepare_ctxt_thread, args=(self, target, args)).start()
35+
thread = threading.Thread(target=_prepare_ctxt_thread, args=(self, target, args))
36+
thread.start()
37+
return thread
38+
39+
def launch_thread_timer(self, target, args, delay):
40+
thread = threading.Timer(delay, function=_prepare_ctxt_thread, args=(self, target, args))
41+
thread.start()
42+
return thread
3443

3544
@staticmethod
3645
def get():

server/update_event_queue.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,20 +59,20 @@ def set_delay(self, delay):
5959
self.delay = delay / 1000.0
6060

6161
def push(self, event:UpdateEvent):
62+
from .odoo_language_server import OdooLanguageServer
6263
with self.lock:
6364
if self.panic_mode:
6465
#do no add anything, but update time of the last event
6566
if self.queue:
6667
self.queue[-1].time = time.time()
6768
return
68-
self.queue = [e for e in self.queue if e.path != event.path]
69+
self.queue = [e for e in self.queue if e.path != event.path] #TODO write this with a set
6970
if len(self.queue) > 10:
7071
self.panic_mode = True
7172
event.time = time.time()
7273
self.queue.append(event)
7374
if self.thread is None:
74-
self.thread = threading.Timer(self.delay, self.process)
75-
self.thread.start()
75+
self.thread = OdooLanguageServer.get().launch_thread_timer(target=self.process, args=(), delay = self.delay)
7676

7777
def clear(self):
7878
with self.lock:
@@ -85,8 +85,7 @@ def process(self):
8585
self.thread = None
8686
if self.queue:
8787
if self.queue[-1].time + self.delay > time.time():
88-
self.thread = threading.Timer(self.queue[-1].time + self.delay - time.time(), self.process)
89-
self.thread.start()
88+
self.thread = odoo_server.launch_thread_timer(target=self.process, args=(), delay = self.queue[-1].time + self.delay - time.time())
9089
return
9190
if self.panic_mode:
9291
Odoo.reload_database(odoo_server)
@@ -100,5 +99,4 @@ def process(self):
10099
if acquired:
101100
Odoo.get().process_rebuilds(odoo_server)
102101
else:
103-
self.thread = threading.Timer(1.0, self.process)
104-
self.thread.start()
102+
self.thread = odoo_server.launch_thread_timer(target=self.process, args=(self,), delay = 1.0)

0 commit comments

Comments
 (0)