summaryrefslogtreecommitdiffstatshomepage
path: root/tekuti/mod-lisp.scm
diff options
context:
space:
mode:
Diffstat (limited to 'tekuti/mod-lisp.scm')
-rw-r--r--tekuti/mod-lisp.scm61
1 files changed, 45 insertions, 16 deletions
diff --git a/tekuti/mod-lisp.scm b/tekuti/mod-lisp.scm
index 7c22267..b796815 100644
--- a/tekuti/mod-lisp.scm
+++ b/tekuti/mod-lisp.scm
@@ -28,6 +28,7 @@
#:use-module (ice-9 rdelim)
#:use-module (ice-9 receive)
#:use-module (ice-9 stack-catch)
+ #:use-module ((srfi srfi-1) #:select (fold))
#:use-module (sxml simple)
#:use-module (sxml transform)
#:use-module (tekuti config)
@@ -74,8 +75,8 @@
(define (connection-received socket sockaddr index)
(let* ((headers (pk (read-headers socket)))
(post-data (read-chars (string->number
- (pk (or (assoc-ref headers "content-length")
- "0")))
+ (or (assoc-ref headers "content-length")
+ "0"))
socket)))
(catch
#t
@@ -101,35 +102,63 @@
(define (with-socket proc)
(pk 'listening)
(let ((socket (socket PF_INET SOCK_STREAM 0)))
+ (setsockopt socket SOL_SOCKET SO_REUSEADDR 1)
(bind socket AF_INET (inet-aton *host*) *port*)
(listen socket *backlog*)
(unwind-protect
(proc socket)
(shutdown socket 2))))
+(define (with-time-debugging proc)
+ (let ((start (gettimeofday)))
+ (pk 'start-clock)
+ (let ((val (proc)))
+ (let ((stop (gettimeofday)))
+ (pk 'stop-clock (+ (- (car stop) (car start))
+ (* 1e-6 (- (cdr stop) (cdr start)))))
+
+ val))))
+
+(define indices
+ `((posts . ,reindex-posts)
+ (categories . ,reindex-categories)))
+
+(use-modules (statprof))
+(define (reindex master)
+ (with-backtrace
+ (lambda ()
+ (with-time-debugging
+ (lambda ()
+ (with-statprof #:hz 100
+ (fold (lambda (pair index)
+ (acons (car pair) ((cdr pair) index)
+ index))
+ (acons 'master master '())
+ indices)))))))
+
+(define (maybe-reindex old-master old-index)
+ (let ((master (git-rev-parse "master")))
+ (values
+ master
+ (if (equal? master old-master)
+ old-index
+ (reindex master)))))
+
(define (inner-loop socket cookie index)
(let* ((pair (accept socket))
(fd (car pair))
(sockaddr (cdr pair)))
(receive
(new-cookie new-index) (maybe-reindex cookie index)
- (pk new-cookie new-index)
(connection-received (car pair) (cdr pair) new-index)
(inner-loop socket new-cookie new-index))))
-(define (maybe-reindex old-master old-index)
- (let ((master (git-rev-parse "master")))
- (values
- master
- (if (equal? master old-master)
- old-index
- (acons 'master master
- (map (lambda (k reindex)
- (cons k (reindex master)))
- (list 'posts 'categories)
- (list reindex-posts reindex-categories)))))))
-
(define (event-loop)
(with-socket
(lambda (socket)
- (inner-loop socket #f #f))))
+ (format #t "running initial index\n")
+ (receive
+ (master index) (maybe-reindex #f #f)
+ (format #t "entering inner loop\n")
+ (inner-loop socket master index)))))
+