+(defun start-save-thread (data-dir)
+ (log:info "Starting Save Thread")
+ (let*
+ ((mutex (sb-thread:make-mutex))
+ (waitq (sb-thread:make-waitqueue))
+ (active t)
+ (save-thread
+ (sb-thread:make-thread
+ (lambda ()
+ (loop
+ :while active
+ :do
+ (sb-thread:with-mutex (mutex)
+ (sb-thread:condition-wait waitq mutex)
+ (lame-db:save-known-dbs data-dir))))
+ :name "Save Thread")))
+ (sb-thread:make-thread
+ (lambda ()
+ (loop
+ (sleep (* 5 60))
+ (sb-thread:with-mutex (mutex)
+ (sb-thread:condition-broadcast waitq))))
+ :name "Save Thread Trigger")
+ (push
+ (lambda ()
+ (log:info "Shutting down save thread")
+ (sb-thread:with-mutex (mutex)
+ (setf active nil)
+ (sb-thread:condition-broadcast waitq))
+ (sb-thread:join-thread save-thread))
+ sb-ext:*exit-hooks*)))
+
+(defun find-project-by-name-or-die (name)
+ (when name
+ (or
+ (find name *all-project* :test #'string= :key #'project-name)
+ (raise-candle-error :project-does-not-exist))))
+