]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/Resource/Tree.hs
Optimized as possible as I can.
[Lucu.git] / Network / HTTP / Lucu / Resource / Tree.hs
index d468d2b482baaa09da6af0289ba31e4067d1929a..9af5fd54ed809d19b1f65c168748a02b7878a641 100644 (file)
@@ -45,7 +45,7 @@ data ResourceDef = ResourceDef {
     -- | Whether to run a 'Network.HTTP.Lucu.Resource.Resource' on a
     -- native thread (spawned using @forkOS@) or to run it on a user
     -- thread (spanwed using @forkIO@). Generally you don't
-      resUsesNativeThread :: Bool
+      resUsesNativeThread :: !Bool
     -- | Whether to be greedy or not.
     -- 
     -- Say a client is trying to access \/aaa\/bbb\/ccc. If there is a
@@ -53,7 +53,7 @@ data ResourceDef = ResourceDef {
     -- there is another resource at \/aaa\/bbb\/ccc. If the resource
     -- at \/aaa\/bbb is not greedy, it is just ignored. Greedy
     -- resource is like a CGI script.
-    , resIsGreedy         :: Bool
+    , resIsGreedy         :: !Bool
     -- | A 'Network.HTTP.Lucu.Resource.Resource' to be run when a GET
     -- request comes for the resource path. If 'resGet' is Nothing,
     -- the system responds \"405 Method Not Allowed\" for GET
@@ -62,35 +62,35 @@ data ResourceDef = ResourceDef {
     -- It also runs for HEAD request if the 'resHead' is Nothing. In
     -- this case 'Network.HTTP.Lucu.Resource.output' and such like
     -- don't actually write a response body.
-    , resGet              :: Maybe (Resource ())
+    , resGet              :: !(Maybe (Resource ()))
     -- | A 'Network.HTTP.Lucu.Resource.Resource' to be run when a HEAD
     -- request comes for the resource path. If 'resHead' is Nothing,
     -- the system runs 'resGet' instead. If 'resGet' is also Nothing,
     -- the system responds \"405 Method Not Allowed\" for HEAD
     -- requests.
-    , resHead             :: Maybe (Resource ())
+    , resHead             :: !(Maybe (Resource ()))
     -- | A 'Network.HTTP.Lucu.Resource.Resource' to be run when a POST
     -- request comes for the resource path. If 'resPost' is Nothing,
     -- the system responds \"405 Method Not Allowed\" for POST
     -- requests.
-    , resPost             :: Maybe (Resource ())
+    , resPost             :: !(Maybe (Resource ()))
     -- | A 'Network.HTTP.Lucu.Resource.Resource' to be run when a PUT
     -- request comes for the resource path. If 'resPut' is Nothing,
     -- the system responds \"405 Method Not Allowed\" for PUT
     -- requests.
-    , resPut              :: Maybe (Resource ())
+    , resPut              :: !(Maybe (Resource ()))
     -- | A 'Network.HTTP.Lucu.Resource.Resource' to be run when a
     -- DELETE request comes for the resource path. If 'resDelete' is
     -- Nothing, the system responds \"405 Method Not Allowed\" for
     -- DELETE requests.
-    , resDelete           :: Maybe (Resource ())
+    , resDelete           :: !(Maybe (Resource ()))
     }
 
 -- | 'ResTree' is an opaque structure which is a map from resource
 -- path to 'ResourceDef'.
 type ResTree    = ResNode -- root だから Map ではない
 type ResSubtree = Map String ResNode
-data ResNode    = ResNode (Maybe ResourceDef) ResSubtree
+data ResNode    = ResNode !(Maybe ResourceDef) !ResSubtree
 
 -- | 'mkResTree' converts a list of @(path, def)@ to a 'ResTree' e.g.
 --
@@ -100,7 +100,7 @@ data ResNode    = ResNode (Maybe ResourceDef) ResSubtree
 --             ]
 -- @
 mkResTree :: [ ([String], ResourceDef) ] -> ResTree
-mkResTree list = processRoot list
+mkResTree list = list `seq` processRoot list
     where
       processRoot :: [ ([String], ResourceDef) ] -> ResTree
       processRoot list
@@ -167,13 +167,14 @@ findResource (ResNode rootDefM subtree) uri
 
 runResource :: ResourceDef -> Interaction -> IO ThreadId
 runResource def itr
-    = fork
-      $ catch ( runReaderT ( do req <- getRequest
-                                fromMaybe notAllowed $ rsrc req
-                                driftTo Done
-                           ) itr
-              )
-      $ \ exc -> processException exc
+    = def `seq` itr `seq`
+      fork
+      $! catch ( runReaderT ( do req <- getRequest
+                                 fromMaybe notAllowed $ rsrc req
+                                 driftTo Done
+                            ) itr
+               )
+             $ \ exc -> processException exc
     where
       fork :: IO () -> IO ThreadId
       fork = if (resUsesNativeThread def)