@@ -48,6 +48,7 @@ type DB = OrdPSQ SessionID UTCTime Value
48type Item = (SessionID, UTCTime, Value, Operation)
48type Item = (SessionID, UTCTime, Value, Operation)
50data Operation = Add | Del
50data Operation = Add | Del
51+data Use = SingleUse | MultipleUse
51data Availability = Fresh | Used
52data Availability = Fresh | Used
53----------------------------------------------------------------
54----------------------------------------------------------------
@@ -65,7 +66,7 @@ newSessionManager conf = do
65 , reaperDelay = pruningDelay conf * 1000000
66 , reaperDelay = pruningDelay conf * 1000000
67 return SessionManager {
68 return SessionManager {
68− sessionResume = resume reaper
69+ sessionResume = resume reaper MultipleUse
69 , sessionEstablish = establish reaper lifetime
70 , sessionEstablish = establish reaper lifetime
70 , sessionInvalidate = invalidate reaper
71 , sessionInvalidate = invalidate reaper
@@ -101,16 +102,19 @@ establish reaper lifetime k sd = do
101 let !v = (sd,ref)
102 let !v = (sd,ref)
102 reaperAdd reaper (k,p,v,Add)
103 reaperAdd reaper (k,p,v,Add)
104−resume :: Reaper DB Item
105+resume :: Reaper DB Item -> Use
105 -> SessionID -> IO (Maybe SessionData)
106 -> SessionID -> IO (Maybe SessionData)
106−resume reaper k = do
107+resume reaper use k = do
107 db <- reaperRead reaper
108 db <- reaperRead reaper
108 case Q.lookup k db of
109 case Q.lookup k db of
109 Nothing -> return Nothing
110 Nothing -> return Nothing
110 Just (p,v@(sd,ref)) -> do
111 Just (p,v@(sd,ref)) -> do
111− available <- atomicModifyIORef' ref check
114+ available <- atomicModifyIORef' ref check
112− reaperAdd reaper (k,p,v,Del)
115+ reaperAdd reaper (k,p,v,Del)
113− return $ if available then Just sd else Nothing
116+ return $ if available then Just sd else Nothing
117+ MultipleUse -> return $ Just sd
115 check Fresh = (Used,True)
119 check Fresh = (Used,True)
116 check Used = (Used,False)
120 check Used = (Used,False)