Skip to content

Commit ce79864

Browse files
move optimizer cleanup into server and run optimization in thread
1 parent aaafe47 commit ce79864

File tree

2 files changed

+40
-14
lines changed

2 files changed

+40
-14
lines changed

codeflash/lsp/beta.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def initialize_function_optimization(
110110

111111
if count == 0:
112112
server.show_message_log(f"No optimizable functions found for {params.functionName}", "Warning")
113-
cleanup_the_optimizer(server)
113+
server.cleanup_the_optimizer()
114114
return {"functionName": params.functionName, "status": "error", "message": "not found", "args": None}
115115

116116
fto = optimizable_funcs.popitem()[1][0]
@@ -217,6 +217,7 @@ def provide_api_key(server: CodeflashLanguageServer, params: ProvideApiKeyParams
217217

218218

219219
@server.feature("performFunctionOptimization")
220+
@server.thread()
220221
def perform_function_optimization( # noqa: PLR0911
221222
server: CodeflashLanguageServer, params: FunctionOptimizationParams
222223
) -> dict[str, str]:
@@ -337,14 +338,4 @@ def perform_function_optimization( # noqa: PLR0911
337338
"explanation": best_optimization.explanation_v2,
338339
}
339340
finally:
340-
cleanup_the_optimizer(server)
341-
342-
343-
def cleanup_the_optimizer(server: CodeflashLanguageServer) -> None:
344-
server.optimizer.cleanup_temporary_paths()
345-
# restore args and test cfg
346-
if server.optimizer.original_args_and_test_cfg:
347-
server.optimizer.args, server.optimizer.test_cfg = server.optimizer.original_args_and_test_cfg
348-
server.optimizer.args.function = None
349-
server.optimizer.current_worktree = None
350-
server.optimizer.current_function_optimizer = None
341+
server.cleanup_the_optimizer()

codeflash/lsp/server.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
from __future__ import annotations
22

3+
import sys
34
from pathlib import Path
4-
from typing import TYPE_CHECKING, Any
5+
from threading import Event
6+
from typing import TYPE_CHECKING, Any, Optional, TextIO
57

68
from lsprotocol.types import INITIALIZE, LogMessageParams, MessageType
79
from pygls import uris
810
from pygls.protocol import LanguageServerProtocol, lsp_method
9-
from pygls.server import LanguageServer
11+
from pygls.server import LanguageServer, StdOutTransportAdapter, aio_readline
1012

1113
if TYPE_CHECKING:
1214
from lsprotocol.types import InitializeParams, InitializeResult
@@ -81,3 +83,36 @@ def show_message_log(self, message: str, message_type: str) -> None:
8183
# Send log message to client (appears in output channel)
8284
log_params = LogMessageParams(type=lsp_message_type, message=message)
8385
self.lsp.notify("window/logMessage", log_params)
86+
87+
def cleanup_the_optimizer(self) -> None:
88+
self.optimizer.cleanup_temporary_paths()
89+
# restore args and test cfg
90+
if self.optimizer.original_args_and_test_cfg:
91+
self.optimizer.args, self.optimizer.test_cfg = self.optimizer.original_args_and_test_cfg
92+
self.optimizer.args.function = None
93+
self.optimizer.current_worktree = None
94+
self.optimizer.current_function_optimizer = None
95+
96+
def start_io(self, stdin: Optional[TextIO] = None, stdout: Optional[TextIO] = None) -> None:
97+
self.show_message_log("Starting IO server", "Info")
98+
99+
self._stop_event = Event()
100+
transport = StdOutTransportAdapter(stdin or sys.stdin.buffer, stdout or sys.stdout.buffer)
101+
self.lsp.connection_made(transport)
102+
try:
103+
self.loop.run_until_complete(
104+
aio_readline(
105+
self.loop,
106+
self.thread_pool_executor,
107+
self._stop_event,
108+
stdin or sys.stdin.buffer,
109+
self.lsp.data_received,
110+
)
111+
)
112+
except BrokenPipeError:
113+
self.show_message_log("Connection to the client is lost! Shutting down the server.", "Error")
114+
except (KeyboardInterrupt, SystemExit):
115+
pass
116+
finally:
117+
self.cleanup_the_optimizer()
118+
self.shutdown()

0 commit comments

Comments
 (0)