@@ -156,9 +156,9 @@ defmodule ElixirLS.LanguageServer.Tracer do
156
156
157
157
defp maybe_close_tables ( % { project_dir: nil } ) , do: :ok
158
158
159
- defp maybe_close_tables ( % { project_dir: project_dir } ) do
159
+ defp maybe_close_tables ( _state ) do
160
160
for table <- @ tables do
161
- close_table ( table , project_dir )
161
+ close_table ( table )
162
162
end
163
163
164
164
:ok
@@ -227,8 +227,7 @@ defmodule ElixirLS.LanguageServer.Tracer do
227
227
end
228
228
end
229
229
230
- def close_table ( table , project_dir ) do
231
- path = dets_path ( project_dir , table )
230
+ def close_table ( table ) do
232
231
table_name = table_name ( table )
233
232
sync ( table_name )
234
233
@@ -251,14 +250,28 @@ defmodule ElixirLS.LanguageServer.Tracer do
251
250
ms = modules_by_file_matchspec ( file , :"$_" )
252
251
# ms = :ets.fun2ms(fn {_, map} when :erlang.map_get(:file, map) == file -> map end)
253
252
254
- :ets . select ( table_name ( :modules ) , ms )
253
+ table = table_name ( :modules )
254
+ :ets . safe_fixtable ( table , true )
255
+
256
+ try do
257
+ :ets . select ( table , ms )
258
+ after
259
+ :ets . safe_fixtable ( table , false )
260
+ end
255
261
end
256
262
257
263
def delete_modules_by_file ( file ) do
258
264
ms = modules_by_file_matchspec ( file , true )
259
265
# ms = :ets.fun2ms(fn {_, map} when :erlang.map_get(:file, map) == file -> true end)
260
266
261
- :ets . select_delete ( table_name ( :modules ) , ms )
267
+ table = table_name ( :modules )
268
+ :ets . safe_fixtable ( table , true )
269
+
270
+ try do
271
+ :ets . select_delete ( table , ms )
272
+ after
273
+ :ets . safe_fixtable ( table , false )
274
+ end
262
275
end
263
276
264
277
def trace ( :start , % Macro.Env { } = env ) do
@@ -363,16 +376,23 @@ defmodule ElixirLS.LanguageServer.Tracer do
363
376
364
377
def get_trace do
365
378
# TODO get by callee
366
- :ets . tab2list ( table_name ( :calls ) )
367
- |> Enum . map ( fn { { callee , file , line , column } , _ } ->
368
- % {
369
- callee: callee ,
370
- file: file ,
371
- line: line ,
372
- column: column
373
- }
374
- end )
375
- |> Enum . group_by ( fn % { callee: callee } -> callee end )
379
+ table = table_name ( :calls )
380
+ :ets . safe_fixtable ( table , true )
381
+
382
+ try do
383
+ :ets . tab2list ( table )
384
+ |> Enum . map ( fn { { callee , file , line , column } , _ } ->
385
+ % {
386
+ callee: callee ,
387
+ file: file ,
388
+ line: line ,
389
+ column: column
390
+ }
391
+ end )
392
+ |> Enum . group_by ( fn % { callee: callee } -> callee end )
393
+ after
394
+ :ets . safe_fixtable ( table , false )
395
+ end
376
396
end
377
397
378
398
defp sync ( table_name ) do
@@ -405,13 +425,27 @@ defmodule ElixirLS.LanguageServer.Tracer do
405
425
def get_calls_by_file ( file ) do
406
426
ms = calls_by_file_matchspec ( file , :"$_" )
407
427
408
- :ets . select ( table_name ( :calls ) , ms )
428
+ table = table_name ( :calls )
429
+ :ets . safe_fixtable ( table , true )
430
+
431
+ try do
432
+ :ets . select ( table , ms )
433
+ after
434
+ :ets . safe_fixtable ( table , false )
435
+ end
409
436
end
410
437
411
438
def delete_calls_by_file ( file ) do
412
439
ms = calls_by_file_matchspec ( file , true )
413
440
414
- :ets . select_delete ( table_name ( :calls ) , ms )
441
+ table = table_name ( :calls )
442
+ :ets . safe_fixtable ( table , true )
443
+
444
+ try do
445
+ :ets . select_delete ( table , ms )
446
+ after
447
+ :ets . safe_fixtable ( table , false )
448
+ end
415
449
end
416
450
417
451
defp manifest_path ( project_dir ) do
0 commit comments