]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Remove mutex in MSE cipher reader
authorMatt Joiner <anacrolix@gmail.com>
Sun, 25 Feb 2024 22:28:05 +0000 (09:28 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Mon, 26 Feb 2024 11:32:08 +0000 (22:32 +1100)
It has a very noticeable overhead when the race detector is running. It probably has some unattributed performance impact otherwise.

mse/mse.go

index c3a9f3d3ae840c77eed1c37a881111194ae71c9f..582a451f98137ce5ed43e1bf5d0217ba09ff2535 100644 (file)
@@ -87,28 +87,15 @@ func newEncrypt(initer bool, s, skey []byte) (c *rc4.Cipher) {
 type cipherReader struct {
        c  *rc4.Cipher
        r  io.Reader
-       mu sync.Mutex
        be []byte
 }
 
 func (cr *cipherReader) Read(b []byte) (n int, err error) {
-       var be []byte
-       cr.mu.Lock()
-       if len(cr.be) >= len(b) {
-               be = cr.be
-               cr.be = nil
-               cr.mu.Unlock()
-       } else {
-               cr.mu.Unlock()
-               be = make([]byte, len(b))
-       }
-       n, err = cr.r.Read(be[:len(b)])
-       cr.c.XORKeyStream(b[:n], be[:n])
-       cr.mu.Lock()
-       if len(be) > len(cr.be) {
-               cr.be = be
+       if cap(cr.be) < len(b) {
+               cr.be = make([]byte, len(b))
        }
-       cr.mu.Unlock()
+       n, err = cr.r.Read(cr.be[:len(b)])
+       cr.c.XORKeyStream(b[:n], cr.be[:n])
        return
 }