Skip to content

Commit bd4318f

Browse files
committed
optimize cache and cancel algorithms
1 parent b9a46a4 commit bd4318f

File tree

9 files changed

+319
-168
lines changed

9 files changed

+319
-168
lines changed

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@
119119
],
120120
"escape": [
121121
"constant.character.escape.robotframework"
122+
],
123+
"namespace": [
124+
"entity.name.namespace.robotframework"
122125
]
123126
}
124127
}
@@ -137,7 +140,7 @@
137140
"configuration": "./language-configuration.json"
138141
}
139142
],
140-
"#grammars": [
143+
"grammars": [
141144
{
142145
"language": "robotframework",
143146
"scopeName": "source.robotframework",

robotcode/debugger/protocol.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ def done(f: asyncio.Future[Any]) -> None:
163163
self._logger.exception(ex, exc_info=ex)
164164

165165
for m in iterator:
166-
future = asyncio.ensure_future(self.handle_message(m))
167-
future.add_done_callback(done)
166+
task = asyncio.create_task(self.handle_message(m))
167+
task.add_done_callback(done)
168168

169169
@_logger.call
170170
async def handle_message(self, message: ProtocolMessage) -> None:
@@ -262,11 +262,11 @@ async def handle_request(self, message: Request) -> None:
262262

263263
try:
264264
if e is None or not callable(e.method):
265-
result = asyncio.ensure_future(self.handle_unknown_command(message))
265+
result = asyncio.create_task(self.handle_unknown_command(message))
266266
else:
267267
params = self._convert_params(e.method, e.param_type, message.arguments)
268268

269-
result = asyncio.ensure_future(ensure_coroutine(e.method)(*params[0], **params[1]))
269+
result = asyncio.create_task(ensure_coroutine(e.method)(*params[0], **params[1]))
270270

271271
with self._received_request_lock:
272272
self._received_request[message.seq] = result

robotcode/jsonrpc2/protocol.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -399,11 +399,11 @@ def connection_made(self, transport: asyncio.BaseTransport) -> None:
399399
if isinstance(transport, asyncio.WriteTransport):
400400
self.write_transport = transport
401401

402-
asyncio.ensure_future(self.on_connection_made(self, transport))
402+
asyncio.create_task(self.on_connection_made(self, transport))
403403

404404
@_logger.call
405405
def connection_lost(self, exc: Optional[BaseException]) -> None:
406-
asyncio.ensure_future(self.on_connection_lost(self, exc))
406+
asyncio.create_task(self.on_connection_lost(self, exc))
407407

408408
@_logger.call
409409
def eof_received(self) -> Optional[bool]:
@@ -508,8 +508,8 @@ def done(f: asyncio.Future[Any]) -> None:
508508
self._logger.exception(ex, exc_info=ex)
509509

510510
for m in iterator:
511-
future = asyncio.ensure_future(self.handle_message(m))
512-
future.add_done_callback(done)
511+
task = asyncio.create_task(self.handle_message(m))
512+
task.add_done_callback(done)
513513

514514
@_logger.call
515515
async def handle_message(self, message: JsonRPCMessage) -> None:
@@ -698,7 +698,7 @@ async def handle_request(self, message: JsonRPCRequest) -> None:
698698
try:
699699
params = self._convert_params(e.method, e.param_type, message.params)
700700

701-
result = asyncio.ensure_future(ensure_coroutine(e.method)(*params[0], **params[1]))
701+
result = asyncio.create_task(ensure_coroutine(e.method)(*params[0], **params[1]))
702702

703703
with self._received_request_lock:
704704
self._received_request[message.id] = result

robotcode/jsonrpc2/server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,12 @@ def start_stdio(self) -> None:
116116

117117
protocol = self.create_protocol()
118118

119-
protocol.connection_made(transport)
120-
121119
def run_io_nonblocking() -> None:
122120
self._stdio_stop_event = asyncio.Event()
123121

124122
async def aio_readline(rfile: BinaryIO, protocol: asyncio.Protocol) -> None:
123+
protocol.connection_made(transport)
124+
125125
while self._stdio_stop_event is not None and not self._stdio_stop_event.is_set() and not rfile.closed:
126126
data = await self.loop.run_in_executor(None, cast(io.BufferedReader, rfile).read1, 1000)
127127
protocol.data_received(data)

robotcode/language_server/common/parts/diagnostics.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ async def cancel() -> None:
8282
except BaseException:
8383
pass
8484

85-
asyncio.ensure_future(cancel())
85+
asyncio.create_task(cancel())
8686

8787

8888
@dataclass

robotcode/language_server/common/text_document.py

Lines changed: 19 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ class InvalidRangeError(Exception):
3838
_T = TypeVar("_T")
3939

4040

41+
class CacheEntry:
42+
def __init__(self, data: Any = None) -> None:
43+
self.data = data
44+
self.lock: asyncio.Lock = asyncio.Lock()
45+
46+
4147
class TextDocument:
4248
def __init__(
4349
self,
@@ -73,7 +79,7 @@ def __init__(
7379

7480
self._lines: Optional[List[str]] = None
7581

76-
self._cache: Dict[weakref.ref[Any], Any] = {}
82+
self._cache: Dict[weakref.ref[Any], CacheEntry] = {}
7783
self._in_change_cache = False
7884

7985
self._data: weakref.WeakKeyDictionary[Any, Any] = weakref.WeakKeyDictionary()
@@ -170,23 +176,6 @@ async def invalidate_data(self) -> None:
170176
async with self._lock:
171177
self._invalidate_data()
172178

173-
async def get_cache(
174-
self,
175-
entry: Union[Callable[[TextDocument], Awaitable[_T]], Callable[..., Awaitable[_T]]],
176-
*args: Any,
177-
**kwargs: Any,
178-
) -> _T:
179-
if self._in_change_cache:
180-
return await self._get_cache(entry, *args, **kwargs)
181-
182-
else:
183-
self._in_change_cache = True
184-
try:
185-
async with self._lock:
186-
return await self._get_cache(entry, *args, **kwargs)
187-
finally:
188-
self._in_change_cache = False
189-
190179
async def __remove_cache_entry_safe(self, ref: Any) -> None:
191180
async with self._lock:
192181
self._cache.pop(ref)
@@ -206,7 +195,7 @@ def __get_cache_reference(self, entry: Callable[..., Any]) -> weakref.ref[Any]:
206195

207196
return reference
208197

209-
async def _get_cache(
198+
async def get_cache(
210199
self,
211200
entry: Union[Callable[[TextDocument], Awaitable[_T]], Callable[..., Awaitable[_T]]],
212201
*args: Any,
@@ -216,42 +205,21 @@ async def _get_cache(
216205
reference = self.__get_cache_reference(entry)
217206

218207
if reference not in self._cache:
219-
self._cache[reference] = None
208+
async with self._lock:
209+
self._cache[reference] = CacheEntry()
220210

221-
if self._cache[reference] is None:
222-
result = entry(self, *args, **kwargs) # type: ignore
211+
e = self._cache[reference]
223212

224-
if isinstance(result, Awaitable):
225-
self._cache[reference] = await result
226-
else:
227-
self._cache[reference] = result
228-
229-
return cast("_T", self._cache[reference])
230-
231-
async def set_cache(
232-
self,
233-
entry: Union[Callable[[TextDocument], Awaitable[_T]], Callable[..., Awaitable[_T]]],
234-
data: _T,
235-
) -> _T:
236-
if self._in_change_cache:
237-
return await self._set_cache(entry, data)
238-
239-
else:
240-
self._in_change_cache = True
241-
try:
242-
async with self._lock:
243-
return await self._set_cache(entry, data)
244-
finally:
245-
self._in_change_cache = False
246-
247-
async def _set_cache(
248-
self, entry: Union[Callable[[TextDocument], Awaitable[_T]], Callable[..., Awaitable[_T]]], data: _T
249-
) -> _T:
250-
reference = self.__get_cache_reference(entry)
213+
async with e.lock:
214+
if e.data is None:
215+
result = entry(self, *args, **kwargs) # type: ignore
251216

252-
self._cache[reference] = data
217+
if isinstance(result, Awaitable):
218+
e.data = await result
219+
else:
220+
e.data = result
253221

254-
return data
222+
return cast("_T", e.data)
255223

256224
async def remove_cache_entry(
257225
self, entry: Union[Callable[[TextDocument], Awaitable[_T]], Callable[..., Awaitable[_T]]]

0 commit comments

Comments
 (0)