diff --git a/HTicTacToe.cabal b/HTicTacToe.cabal
--- a/HTicTacToe.cabal
+++ b/HTicTacToe.cabal
@@ -7,10 +7,10 @@
 -- The package version. See the Haskell package versioning policy
 -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for
 -- standards guiding when and how versions should be incremented.
-Version:             0.1
+Version:             0.2
 
 -- A short (one-line) description of the package.
-Synopsis:            A tic-tac-toe game.
+Synopsis:            An SDL tic-tac-toe game.
 
 -- A longer description of the package.
 Description:         Another tic-tac-toe game in Haskell using the SDL bindings.
diff --git a/Surface.hs b/Surface.hs
--- a/Surface.hs
+++ b/Surface.hs
@@ -70,21 +70,28 @@
     pokeElemOff (castPtr ps :: Ptr Word32) offset pixel
  where offset = y * (fromIntegral $ surfaceGetPitch s `div` 4) + x
 
+withLock :: MonadIO m => Surface -> m () -> m ()
+withLock s act = do
+    liftIO $ lockSurface s
+    act
+    liftIO $ unlockSurface s
+    
 type Point2 = (Int,Int)
-
 data LineDir = Vertical | Horizontal
 
 drawLine :: Surface -> Point2 -> Int -> Int -> LineDir -> Pixel -> IO ()
 drawLine dst (x,y) len thickness Horizontal colour =
-    forM_ [(r,c) | c <- [yStart..yEnd], r <- [x..(x + len)]] $ \(r,c) ->
-        setPixel32 dst r c colour
+    withLock dst $
+        forM_ [(r,c) | c <- [yStart..yEnd], r <- [x..(x + len)]] $ \(r,c) ->
+            setPixel32 dst r c colour
  where halfLen = thickness `div` 2
        yStart  = max (y - halfLen) 0
        yEnd    = min (yStart + thickness) $  surfaceGetHeight dst
 
 drawLine dst (x,y) len thickness Vertical colour =
-    forM_ [(r,c) | r <- [xStart..xEnd], c <- [y..(y + len)]] $ \(r,c) ->
-        setPixel32 dst r c colour
+    withLock dst $
+        forM_ [(r,c) | r <- [xStart..xEnd], c <- [y..(y + len)]] $ \(r,c) ->
+            setPixel32 dst r c colour
  where halfLen = thickness `div` 2
        xStart  = max (x - halfLen) 0
        xEnd    = min (xStart + thickness) $ surfaceGetWidth dst
