cl-grep

Simple implementation of grep
Log | Files | Refs

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:
Mgrep.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)