diff -r 9cfdb9bc6140 -r f475e10c4081 gameServer/Store.hs --- a/gameServer/Store.hs Thu Apr 07 11:30:56 2011 -0400 +++ b/gameServer/Store.hs Thu Apr 07 21:43:43 2011 +0400 @@ -69,23 +69,15 @@ when (IntSet.null freeElems) $ growStore m -truncateStore :: MStore e -> IO () -truncateStore (MStore ref) = do - (busyElems, freeElems, arr) <- readIORef ref - (_, m') <- IOA.getBounds arr - let newM' = truncFunc (m' + 1) - 1 - newArr <- IOA.newArray_ (0, newM') - sequence_ [IOA.readArray arr i >>= IOA.writeArray newArr i | i <- IntSet.toList busyElems] - writeIORef ref (busyElems, freeElems `IntSet.difference` IntSet.fromAscList [newM'..m'+1], newArr) - - truncateIfNeeded :: MStore e -> IO () -truncateIfNeeded m@(MStore ref) = do +truncateIfNeeded (MStore ref) = do (busyElems, _, arr) <- readIORef ref (_, m') <- IOA.getBounds arr let newM' = truncFunc (m' + 1) - 1 - let allLessM = all (< newM') $ IntSet.elems busyElems - when (newM' < m' && allLessM) $ truncateStore m + when (newM' < m' && (not $ IntSet.null busyElems) && IntSet.findMax busyElems <= newM') $ do + newArr <- IOA.newArray_ (0, newM') + sequence_ [IOA.readArray arr i >>= IOA.writeArray newArr i | i <- IntSet.toList busyElems] + writeIORef ref (busyElems, IntSet.fromAscList [0..newM'] `IntSet.difference` busyElems, newArr) addElem :: MStore e -> e -> IO ElemIndex