From 856a91865b2af004f35b69dc2237722ebb5412cc Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Fri, 16 Jan 2009 08:42:17 +0000 Subject: [PATCH] avoid using force/delay (see comment) svn: r13162 --- collects/web-server/private/mime-types.ss | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/collects/web-server/private/mime-types.ss b/collects/web-server/private/mime-types.ss index b129767d36..af0c01fb76 100644 --- a/collects/web-server/private/mime-types.ss +++ b/collects/web-server/private/mime-types.ss @@ -1,7 +1,6 @@ #lang scheme/base (require scheme/contract - scheme/match - scheme/promise) + scheme/match) (require "util.ss" web-server/http) (provide/contract @@ -32,11 +31,21 @@ ;; 1. Can we determine the mime type based on file contents? ;; 2. Assuming that 7-bit ASCII is correct for mime-type (define (make-path->mime-type a-path) - (define MIME-TYPE-TABLE (delay (read-mime-types a-path))) + ;; it would be nice to just use delay/force -- but this can be called by + ;; multiple threads at the same time, causing a "reentrant promise" error. + (define sema (make-semaphore 1)) + (define MIME-TYPE-TABLE #f) (lambda (path) (match (path->bytes path) [(regexp #rx#".*\\.([^\\.]*$)" (list _ sffx)) - (hash-ref (force MIME-TYPE-TABLE) + (hash-ref (or MIME-TYPE-TABLE + (dynamic-wind + (lambda () (semaphore-wait sema)) + (lambda () (or MIME-TYPE-TABLE ; maybe already read + (begin (set! MIME-TYPE-TABLE + (read-mime-types a-path)) + MIME-TYPE-TABLE))) + (lambda () (semaphore-post sema)))) (lowercase-symbol! sffx) TEXT/HTML-MIME-TYPE)] [_ TEXT/HTML-MIME-TYPE])))