commit 353ba1fd8687c7efba0741d38167c4419724f616
parent 35b8c35a79855b6191ad4b772431aa82eec541e7
Author: ChanderG <[email protected]>
Date: Wed, 3 Dec 2025 10:46:35 +0530
move printing to separate thread
queue output tasks from worker threads into a single print worker
Diffstat:
| M | grep.lisp | | | 31 | ++++++++++++++++++++++++------- |
1 file changed, 24 insertions(+), 7 deletions(-)
diff --git a/grep.lisp b/grep.lisp
@@ -3,8 +3,13 @@
(defparameter *match* nil)
(defparameter *queue* nil)
+(defparameter *print-queue* nil)
(defun setup-tasks-mgmt ()
- (setf *queue* (lq:make-queue)))
+ (setf *queue* (lq:make-queue))
+ (setf *print-queue* (lq:make-queue)))
+
+(defstruct file-result
+ name entries)
(defun grep-file (file match-idx)
(lo "Grepping file: ~a" file)
@@ -16,10 +21,8 @@
if (sm:search-bmh8 match-idx line)
collect line)))
(when results
- (format t "~a: ~%" file)
- (loop for l in results do
- (format t "~a~%" l))
- (format t "~%"))))
+ (lq:push-queue (make-file-result :name file :entries results)
+ *print-queue*))))
(stream-error (stream)
(lo "Skipping binary file: ~a" file))
(error (c)
@@ -33,6 +36,18 @@
(return))
(grep-file task match-idx)))))
+(defun result-printer ()
+ (loop
+ (let ((task (lq:pop-queue *print-queue*)))
+ (if (eq task :done)
+ (return))
+ (let ((name (file-result-name task))
+ (results (file-result-entries task)))
+ (format t "~a: ~%" name)
+ (loop for l in results do
+ (format t "~a~%" l))
+ (format t "~%")))))
+
(defun queue-file (file)
(lo "Visiting file: ~a" file)
(let* ((name (pu:file-name file))
@@ -76,12 +91,14 @@
(setup-tasks-mgmt)
(let* ((numw 4)
(workers (loop for i from 0 below numw
- collect (bt:make-thread #'process-task))))
+ collect (bt:make-thread #'process-task)))
+ (print-worker (bt:make-thread #'result-printer)))
(fs-walker dir)
(lo "Finished processing target walking!")
(loop for i from 0 below numw
do (lq:push-queue :done *queue*))
- (loop for w in workers do (bt:join-thread w))))
+ (loop for w in workers do (bt:join-thread w))
+ (lq:push-queue :done *print-queue*)))
(defun main ()
(log-setup)