6
6
; ; Maintainer: Matúš Goljer <[email protected] >
7
7
; ; Created: 23rd March 2017
8
8
; ; Version: 0.1.0
9
- ; ; Package-Requires: ((emacs "26.1") (trinary "0") (f "0") (dash "2.14") (cl-lib "0.3") (lsp-mode "0") (ansi "0") (" async" "1.9.7"))
9
+ ; ; Package-Requires: ((emacs "26.1") (trinary "0") (f "0") (dash "2.14") (cl-lib "0.3") (lsp-mode "0") (ansi "0") (async "1.9.7"))
10
10
; ; URL: https://github.com/emacs-elsa/Elsa
11
11
; ; Keywords: languages, lisp
12
12
@@ -283,80 +283,100 @@ GLOBAL-STATE is the initial configuration."
283
283
" Return function running in the Elsa analysis worker."
284
284
(let ((load--path load-path))
285
285
(lambda ()
286
- (setq load-path load--path)
287
- (setq elsa-is-language-server nil )
288
- (setq ansi-inhibit-ansi t )
289
- (require 'elsa )
290
- (require 'async )
291
- (let ((msg nil ))
292
- (setq elsa-global-state (elsa-global-state))
293
- (oset elsa-global-state project-directory project-directory)
294
- (oset elsa-global-state number-of-files 1 )
295
- (oset elsa-global-state processed-file-index 1 )
296
- (catch 'done
297
- (while t
298
- (setq msg (async-receive))
299
- (let ((op (plist-get msg :op )))
300
- (cond
301
- ((equal op " analyze" )
302
- (let* ((dep (plist-get msg :dep ))
303
- (library (plist-get msg :file ))
304
- (current-time (current-time ))
305
- (elsa-cache-file (elsa--get-cache-file-name elsa-global-state dep)))
306
- (elsa--autoload-types elsa-global-state dep)
307
- (elsa--autoload-extension elsa-global-state dep)
308
- (condition-case err
309
- (let ((state (elsa-process-file library elsa-global-state)))
310
- ; ; `subr' has no provide for some circular
311
- ; ; dependency "bootstrap" issues. We add it here
312
- ; ; artificially.
313
- (when (equal dep " subr" )
314
- (oset state provide (list 'subr )))
315
- (elsa-save-cache state elsa-global-state))
316
- (error (async-send :ack " error" :error err)))
317
- (async-send :ack " ok" :op op
318
- :worker-id worker-id :dep dep
319
- :file library
320
- :duration (float-time
321
- (time-subtract
322
- (current-time ) current-time)))))
323
- ((equal op " load-from-cache" )
324
- (let ((files (plist-get msg :files )))
325
- (dolist (file files ) (load (f-no-ext file) t t ))
326
- (async-send :ack " ok" :op op :worker-id worker-id)))
327
- ((equal op " quit" )
328
- (throw 'done t ))))))))))
286
+ (condition-case err
287
+ (progn
288
+ (setq load-path load--path)
289
+ (setq elsa-is-language-server nil )
290
+ (setq ansi-inhibit-ansi t )
291
+ (require 'elsa )
292
+ (require 'async )
293
+ (require 'lgr )
294
+ (-> (lgr-get-logger " elsa" )
295
+ (lgr-reset-appenders)
296
+ (lgr-add-appender
297
+ (-> (elsa-worker-appender)
298
+ (lgr-set-layout (elsa-plain-layout))))
299
+ (lgr-set-threshold lgr-level-info))
300
+ (let ((msg nil )
301
+ (lgr (lgr-get-logger " elsa.analyse.worker" )))
302
+ (setq elsa-global-state (elsa-global-state))
303
+ (oset elsa-global-state project-directory project-directory)
304
+ (oset elsa-global-state number-of-files 1 )
305
+ (oset elsa-global-state processed-file-index 1 )
306
+ (catch 'done
307
+ (while t
308
+ (setq msg (async-receive))
309
+ (let ((op (plist-get msg :op )))
310
+ (cond
311
+ ((equal op " analyze" )
312
+ (let* ((dep (plist-get msg :dep ))
313
+ (library (plist-get msg :file ))
314
+ (current-time (current-time ))
315
+ (elsa-cache-file (elsa--get-cache-file-name elsa-global-state dep)))
316
+ (elsa--autoload-types elsa-global-state dep)
317
+ (elsa--autoload-extension elsa-global-state dep)
318
+ (lgr-debug lgr " Starting analysis of %s" dep)
319
+ (let ((state (elsa-process-file library elsa-global-state)))
320
+ ; ; `subr' has no provide for some circular
321
+ ; ; dependency "bootstrap" issues. We add it here
322
+ ; ; artificially.
323
+ (lgr-debug lgr " Analysis of %s done" dep)
324
+ (when (equal dep " subr" )
325
+ (oset state provide (list 'subr )))
326
+ (elsa-save-cache state elsa-global-state)
327
+ (lgr-debug lgr " Finished saving cache for %s" dep))
328
+ (async-send :ack " ok" :op op
329
+ :dep dep
330
+ :file library
331
+ :duration (float-time
332
+ (time-subtract
333
+ (current-time ) current-time)))))
334
+ ((equal op " load-from-cache" )
335
+ (let ((files (plist-get msg :files )))
336
+ (dolist (file files ) (load (f-no-ext file) t t ))
337
+ (async-send :ack " ok" :op op)))
338
+ ((equal op " quit" )
339
+ (throw 'done t ))))))))
340
+ (error (async-send :ack " error" :error err :trace (progn (require 'backtrace ) (backtrace-to-string))))))))
329
341
330
342
(defun elsa--parent-function-factory (worker-id workers-state max-file-name-length global-state )
331
343
" Function handling child-to-parent messages and worker exit."
332
- (lambda (result )
333
- (if (async-message-p result)
334
- (let* ((worker-id (plist-get result :worker-id ))
335
- (worker-state (assoc worker-id workers-state))
336
- (op (plist-get result :op )))
337
- (cond
338
- ((equal op " analyze" )
339
- (let* ((dep (plist-get result :dep ))
340
- (file (plist-get result :file ))
341
- (duration (plist-get result :duration ))
342
- (elsa-cache-file (elsa--get-cache-file-name global-state dep)))
344
+ (let ((lgr (lgr-get-logger " elsa.analyse.parent" )))
345
+ (lambda (result )
346
+ (if (async-message-p result)
347
+ (let* ((worker-state (assoc worker-id workers-state))
348
+ (op (plist-get result :op ))
349
+ (ack (plist-get result :ack )))
350
+ (cond
351
+ ((equal ack " error" )
352
+ (error " Error in child process %d %s " worker-id (plist-get result :error )))
353
+ ((equal op " echo" )
343
354
(elsa-log
344
- (elsa--processing-line global-state " done" file worker-id duration))
345
- (load (f-no-ext elsa-cache-file) t t ))
346
- (cl-incf (oref global-state processed-file-index))
347
- (setf (cdr worker-state) (plist-put (cdr worker-state) :ready t )))
348
- ((equal op " load-from-cache" )
349
- (elsa-debug " Worker %s loaded all cache files for this layer" worker-id)
350
- (setf (cdr worker-state) (plist-put (cdr worker-state) :ready t )))))
351
- (elsa-debug " Async process done in worker %d, result: %s" worker-id result)
352
- t )))
355
+ (with-ansi
356
+ (red " Worker %d said: " worker-id)
357
+ (yellow (plist-get result :message )))))
358
+ ((equal op " analyze" )
359
+ (let* ((dep (plist-get result :dep ))
360
+ (file (plist-get result :file ))
361
+ (duration (plist-get result :duration ))
362
+ (elsa-cache-file (elsa--get-cache-file-name global-state dep)))
363
+ (elsa-log
364
+ (elsa--processing-line global-state " done" file worker-id duration))
365
+ (load (f-no-ext elsa-cache-file) t t ))
366
+ (cl-incf (oref global-state processed-file-index))
367
+ (setf (cdr worker-state) (plist-put (cdr worker-state) :ready t )))
368
+ ((equal op " load-from-cache" )
369
+ (lgr-debug lgr " Worker %s loaded all cache files for this layer" worker-id)
370
+ (setf (cdr worker-state) (plist-put (cdr worker-state) :ready t )))))
371
+ (lgr-debug lgr " Async process done in worker %d, result: %s" worker-id result)
372
+ t ))))
353
373
354
374
(defun elsa--wait-for-all (get-worker-states )
355
375
(catch 'all-workers-ready
356
376
(while t
357
377
(when (--all? (plist-get (cdr it) :ready ) (funcall get-worker-states))
358
378
(throw 'all-workers-ready t ))
359
- (sleep-for 0.1 ))))
379
+ (sleep-for 0.01 ))))
360
380
361
381
(defun elsa-analyse-file-parallel (file global-state &optional already-loaded )
362
382
" Analyse FILE with GLOBAL-STATE.
@@ -365,7 +385,8 @@ Optional argument ALREADY-LOADED is used to skip dependencies which
365
385
are already loaded in the currently running Emacs process. This is
366
386
used by the LSP server to not reload already processed files."
367
387
(elsa-with-elapsed-time " Process dependencies"
368
- (let* ((dep-layers (elsa-with-elapsed-time " Resolving dependencies"
388
+ (let* ((lgr (lgr-get-logger " elsa.analyse" ))
389
+ (dep-layers (elsa-with-elapsed-time " Resolving dependencies"
369
390
(elsa-get-dependencies-as-layers file)))
370
391
(dependencies (let ((deps (append
371
392
(plist-get dep-layers :layers )
@@ -399,16 +420,16 @@ used by the LSP server to not reload already processed files."
399
420
(oset global-state processed-file-index 1 )
400
421
(oset global-state number-of-files (length (-flatten dependencies)))
401
422
(oset global-state max-file-name-length max-file-name-length)
402
- (elsa -debug " Processing dependency layers: %s" dependencies)
403
- (elsa -debug " Processing dependency alist: %s" dep-to-file)
423
+ (lgr -debug lgr " Processing dependency layers: %s" dependencies)
424
+ (lgr -debug lgr " Processing dependency alist: %s" dep-to-file)
404
425
(dolist (layer (butlast dependencies))
405
426
(cl-incf i)
406
- (elsa -debug " Processing layer %s" i)
427
+ (lgr -debug lgr " Processing layer %s" i)
407
428
(while layer
408
429
(-each workers-state
409
430
(-lambda ((state &as worker-id . (&plist :ready )))
410
431
(when (and ready layer)
411
- (elsa -debug " Worker %s is ready, submitting dependency %s" worker-id (car layer))
432
+ (lgr -debug lgr " Worker %s is ready, submitting dependency %s" worker-id (car layer))
412
433
(let* ((worker (nth worker-id workers))
413
434
(dep (pop layer))
414
435
(file (or (cdr (assoc dep dep-to-file))
@@ -433,11 +454,11 @@ used by the LSP server to not reload already processed files."
433
454
(elsa--autoload-extension global-state dep)
434
455
(setf (cdr state) (plist-put (cdr state) :ready nil ))
435
456
(async-send worker :op " analyze" :dep dep :file file)))))))
436
- (sleep-for 0.1 ))
437
- (elsa -debug " All work for layer %s was distributed" i)
457
+ (sleep-for 0.01 ))
458
+ (lgr -debug lgr " All work for layer %s was distributed" i)
438
459
439
460
(elsa--wait-for-all (lambda () workers-state))
440
- (elsa -debug " All workers finished processing layer %s" i)
461
+ (lgr -debug lgr " All workers finished processing layer %s" i)
441
462
442
463
(let ((cache-files (mapcar
443
464
(lambda (dep )
@@ -450,11 +471,11 @@ used by the LSP server to not reload already processed files."
450
471
(async-send worker :op " load-from-cache" :files cache-files)))))
451
472
452
473
(elsa--wait-for-all (lambda () workers-state))
453
- (elsa -debug " All workers updated global state for layer %s" i))
474
+ (lgr -debug lgr " All workers updated global state for layer %s" i))
454
475
455
476
(--each workers
456
477
(async-send it :op " quit" ))
457
- (elsa -debug " All workers quit" )
478
+ (lgr -debug lgr " All workers quit" )
458
479
459
480
(let ((start-time (current-time ))
460
481
(state (elsa-process-file (car (-last-item dependencies)) global-state 'no-log ))
@@ -611,15 +632,13 @@ This function is soft-deprecated in favour of
611
632
(bright-blue " %d notices" notices)
612
633
" after "
613
634
(blue " %.3f seconds" duration)))
614
- ; ; (elsa-log "%d elsa-simple-type objects were created" elsa-type-simple-make-count)
615
- ; ; (elsa-log "%d elsa-composite-type objects were created" elsa-type-composite-make-count)
616
- ; ; (elsa-log "clone on simple type was called %d times "elsa-type-simple-clone-count)
617
- ; ; (elsa-debug "memory report %s"
618
- ; ; (with-current-buffer (get-buffer-create "*Memory Report*")
619
- ; ; (require 'memory-report)
620
- ; ; (memory-report)
621
- ; ; (buffer-string)))
622
- )
635
+
636
+ (lgr-trace (lgr-get-logger " elsa.perf" )
637
+ " memory report %s"
638
+ (with-current-buffer (get-buffer-create " *Memory Report*" )
639
+ (require 'memory-report )
640
+ (memory-report)
641
+ (buffer-string ))))
623
642
(when (and elsa-cli-with-exit (< 0 errors))
624
643
(kill-emacs 1 ))))
625
644
0 commit comments