Skip to content

Commit 9b68375

Browse files
committed
Microoptimisation: use PrimVar rather than MutVar in a couple places.
Easy change for types that are in Prim already, or can easily be made so.
1 parent 2168ac9 commit 9b68375

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

src/Database/LSMTree/Internal/CRC32C.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
{-# LANGUAGE OverloadedStrings #-}
44
{-# LANGUAGE ScopedTypeVariables #-}
55

6+
-- Needed by GHC <= 9.2 for newtype deriving Prim below
7+
{-# LANGUAGE DataKinds #-}
8+
{-# LANGUAGE UnboxedTuples #-}
9+
610
-- | Functionalty related to CRC-32C (Castagnoli) checksums:
711
--
812
-- * Support for calculating checksums while incrementally writing files.
@@ -65,6 +69,7 @@ import System.FS.BlockIO.API (ByteCount)
6569

6670
newtype CRC32C = CRC32C Word32
6771
deriving stock (Eq, Ord, Show)
72+
deriving newtype (Prim)
6873

6974

7075
initialCRC32C :: CRC32C

src/Database/LSMTree/Internal/RunBuilder.hs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import Control.Monad.Primitive
2020
import Data.BloomFilter (Bloom)
2121
import qualified Data.ByteString.Lazy as BSL
2222
import Data.Foldable (for_, traverse_)
23-
import Data.Primitive
23+
import Data.Primitive.PrimVar
2424
import Data.Word (Word64)
2525
import Database.LSMTree.Internal.BlobRef (BlobRef, BlobSpan (..))
2626
import qualified Database.LSMTree.Internal.BlobRef as BlobRef
@@ -66,7 +66,7 @@ data RunBuilder m h = RunBuilder {
6666
, runBuilderAcc :: !(RunAcc (PrimState m))
6767

6868
-- | The byte offset within the blob file for the next blob to be written.
69-
, runBuilderBlobOffset :: !(MutVar (PrimState m) Word64)
69+
, runBuilderBlobOffset :: !(PrimVar (PrimState m) Word64)
7070

7171
-- | The (write mode) file handles.
7272
, runBuilderHandles :: {-# UNPACK #-} !(ForRunFiles (ChecksumHandle (PrimState m) h))
@@ -95,7 +95,7 @@ new ::
9595
-> m (RunBuilder m h)
9696
new fs hbio runBuilderFsPaths numEntries alloc = do
9797
runBuilderAcc <- ST.stToIO $ RunAcc.new numEntries alloc
98-
runBuilderBlobOffset <- newMutVar 0
98+
runBuilderBlobOffset <- newPrimVar 0
9999

100100
runBuilderHandles <- traverse (makeHandle fs) (pathsForRunFiles runBuilderFsPaths)
101101

@@ -266,8 +266,8 @@ writeBlob ::
266266
-> m BlobSpan
267267
writeBlob RunBuilder{..} blob = do
268268
let size = sizeofBlob64 blob
269-
offset <- readMutVar runBuilderBlobOffset
270-
modifyMutVar' runBuilderBlobOffset (+size)
269+
offset <- readPrimVar runBuilderBlobOffset
270+
modifyPrimVar runBuilderBlobOffset (+size)
271271
let SerialisedBlob rb = blob
272272
let lbs = BSL.fromStrict $ RB.toByteString rb
273273
writeToHandle runBuilderHasFS (forRunBlob runBuilderHandles) lbs
@@ -342,7 +342,7 @@ writeIndexFinal RunBuilder {..} numEntries index =
342342
-------------------------------------------------------------------------------}
343343

344344
-- | Tracks the checksum of a (write mode) file handle.
345-
data ChecksumHandle s h = ChecksumHandle !(FS.Handle h) !(MutVar s CRC32C)
345+
data ChecksumHandle s h = ChecksumHandle !(FS.Handle h) !(PrimVar s CRC32C)
346346

347347
{-# SPECIALISE makeHandle ::
348348
HasFS IO h
@@ -356,7 +356,7 @@ makeHandle ::
356356
makeHandle fs path =
357357
ChecksumHandle
358358
<$> FS.hOpen fs path (FS.WriteMode FS.MustBeNew)
359-
<*> newMutVar CRC.initialCRC32C
359+
<*> newPrimVar CRC.initialCRC32C
360360

361361
{-# SPECIALISE readChecksum ::
362362
ChecksumHandle RealWorld h
@@ -365,7 +365,7 @@ readChecksum ::
365365
PrimMonad m
366366
=> ChecksumHandle (PrimState m) h
367367
-> m CRC32C
368-
readChecksum (ChecksumHandle _h checksum) = readMutVar checksum
368+
readChecksum (ChecksumHandle _h checksum) = readPrimVar checksum
369369

370370
dropCache :: HasBlockIO m h -> ChecksumHandle (PrimState m) h -> m ()
371371
dropCache hbio (ChecksumHandle h _) = FS.hDropCacheAll hbio h
@@ -385,6 +385,6 @@ writeToHandle ::
385385
-> BSL.ByteString
386386
-> m ()
387387
writeToHandle fs (ChecksumHandle h checksum) lbs = do
388-
crc <- readMutVar checksum
388+
crc <- readPrimVar checksum
389389
(_, crc') <- CRC.hPutAllChunksCRC32C fs h lbs crc
390-
writeMutVar checksum crc'
390+
writePrimVar checksum crc'

0 commit comments

Comments
 (0)