Commit fbca5755 authored by Kirill Smelkov's avatar Kirill Smelkov

X zodb/cache: Allocate OCE from freelist

This avoid 2 allocations (for oidCacheEntry and for its .revv) for NoHit
cache in steady state, speeding things up a bit via lowering pressure on
go gc.

Startup time increase could be either ignored (because it is only when
N(access) < N(cache-size)) or handled later via explicitly preallocating
OCE pool on cache creation.

---- 8< ----

name                        old time/op    new time/op    delta
NoopStorage                   56.6ns ± 1%    57.0ns ± 0%   +0.77%  (p=0.100 n=3+3)
NoopStorage-4                 56.4ns ± 0%    57.1ns ± 0%   +1.24%  (p=0.100 n=3+3)
CacheStartup                  1.95µs ± 2%    1.91µs ±10%     ~     (p=0.700 n=3+3)
CacheStartup-4                1.31µs ± 5%    1.47µs ± 2%  +11.48%  (p=0.100 n=3+3)
CacheNoHit/size=0              590ns ± 1%     502ns ± 1%  -14.81%  (p=0.100 n=3+3)
CacheNoHit/size=0-4            591ns ± 1%     502ns ± 0%  -15.06%  (p=0.100 n=3+3)
CacheNoHit/size=16             707ns ± 0%     622ns ± 1%  -11.98%  (p=0.100 n=3+3)
CacheNoHit/size=16-4           711ns ± 1%     623ns ± 1%  -12.34%  (p=0.100 n=3+3)
CacheNoHit/size=128            717ns ± 0%     624ns ± 0%  -12.88%  (p=0.100 n=3+3)
CacheNoHit/size=128-4          716ns ± 0%     630ns ± 1%  -12.10%  (p=0.100 n=3+3)
CacheNoHit/size=512            737ns ± 0%     645ns ± 0%  -12.40%  (p=0.100 n=3+3)
CacheNoHit/size=512-4          721ns ± 0%     636ns ± 1%  -11.84%  (p=0.100 n=3+3)
CacheNoHit/size=4096           946ns ± 1%     782ns ± 0%  -17.30%  (p=0.100 n=3+3)
CacheNoHit/size=4096-4         780ns ± 1%     680ns ± 0%  -12.86%  (p=0.100 n=3+3)
CacheHit/size=0                589ns ± 1%     507ns ± 0%  -13.98%  (p=0.100 n=3+3)
CacheHit/size=0-4              588ns ± 0%     503ns ± 1%  -14.50%  (p=0.100 n=3+3)
CacheHit/size=16               122ns ± 1%     121ns ± 1%     ~     (p=0.500 n=3+3)
CacheHit/size=16-4             123ns ± 1%     124ns ± 2%     ~     (p=1.000 n=3+3)
CacheHit/size=128              127ns ± 2%     124ns ± 1%     ~     (p=0.200 n=3+3)
CacheHit/size=128-4            126ns ± 1%     126ns ± 1%     ~     (p=0.600 n=3+3)
CacheHit/size=512              128ns ± 2%     127ns ± 1%     ~     (p=0.300 n=3+3)
CacheHit/size=512-4            127ns ± 1%     126ns ± 0%   -1.05%  (p=0.100 n=3+3)
CacheHit/size=4096             130ns ± 0%     130ns ± 3%     ~     (p=0.700 n=3+3)
CacheHit/size=4096-4           130ns ± 1%     129ns ± 1%     ~     (p=0.300 n=3+3)
NoopStoragePar                59.7ns ± 3%    57.0ns ± 0%   -4.47%  (p=0.100 n=3+3)
NoopStoragePar-4              31.3ns ± 8%    30.7ns ± 5%     ~     (p=1.000 n=3+3)
CacheStartupPar               1.97µs ±13%    2.19µs ±10%     ~     (p=0.400 n=3+3)
CacheStartupPar-4             1.49µs ± 4%    1.71µs ± 4%  +14.44%  (p=0.100 n=3+3)
CacheNoHitPar/size=0           591ns ± 0%     510ns ± 0%  -13.65%  (p=0.100 n=3+3)
CacheNoHitPar/size=0-4         811ns ± 0%     726ns ± 0%  -10.40%  (p=0.100 n=3+3)
CacheNoHitPar/size=16          713ns ± 0%     621ns ± 0%  -12.95%  (p=0.100 n=3+3)
CacheNoHitPar/size=16-4        924ns ± 0%     826ns ± 0%  -10.67%  (p=0.100 n=3+3)
CacheNoHitPar/size=128         717ns ± 0%     629ns ± 0%  -12.23%  (p=0.100 n=3+3)
CacheNoHitPar/size=128-4       953ns ± 0%     848ns ± 0%  -11.02%  (p=0.100 n=3+3)
CacheNoHitPar/size=512         733ns ± 0%     645ns ± 0%  -12.00%  (p=0.100 n=3+3)
CacheNoHitPar/size=512-4       972ns ± 0%     881ns ± 0%   -9.36%  (p=0.100 n=3+3)
CacheNoHitPar/size=4096        941ns ± 0%     788ns ± 0%  -16.29%  (p=0.100 n=3+3)
CacheNoHitPar/size=4096-4     1.07µs ± 0%    0.96µs ± 0%  -10.30%  (p=0.100 n=3+3)
CacheHitPar/size=0             587ns ± 0%     509ns ± 0%  -13.23%  (p=0.100 n=3+3)
CacheHitPar/size=0-4           805ns ± 0%     722ns ± 0%  -10.31%  (p=0.100 n=3+3)
CacheHitPar/size=16            122ns ± 1%     123ns ± 2%     ~     (p=1.000 n=3+3)
CacheHitPar/size=16-4          236ns ± 1%     216ns ± 0%   -8.74%  (p=0.100 n=3+3)
CacheHitPar/size=128           125ns ± 1%     125ns ± 1%     ~     (p=1.000 n=3+3)
CacheHitPar/size=128-4         220ns ± 0%     207ns ± 0%   -6.06%  (p=0.100 n=3+3)
CacheHitPar/size=512           127ns ± 2%     127ns ± 1%     ~     (p=0.600 n=3+3)
CacheHitPar/size=512-4         219ns ± 0%     228ns ± 5%     ~     (p=0.600 n=3+3)
CacheHitPar/size=4096          129ns ± 1%     129ns ± 0%     ~     (p=1.000 n=3+3)
CacheHitPar/size=4096-4        223ns ± 5%     223ns ± 4%     ~     (p=1.000 n=3+3)
NoopStorageProc               54.7ns ± 0%    55.1ns ± 0%   +0.67%  (p=0.100 n=3+3)
NoopStorageProc-4             31.8ns ± 4%    29.5ns ± 1%   -7.14%  (p=0.100 n=3+3)
CacheStartupProc              1.88µs ±11%    2.15µs ±11%     ~     (p=0.400 n=3+3)
CacheStartupProc-4            1.13µs ± 3%    1.23µs ± 4%   +9.04%  (p=0.100 n=3+3)
CacheNoHitProc/size=0          598ns ± 0%     500ns ± 0%  -16.33%  (p=0.100 n=3+3)
CacheNoHitProc/size=0-4        309ns ± 0%     297ns ± 1%   -3.89%  (p=0.100 n=3+3)
CacheNoHitProc/size=16         711ns ± 0%     615ns ± 0%  -13.55%  (p=0.100 n=3+3)
CacheNoHitProc/size=16-4       356ns ± 0%     314ns ± 0%  -11.88%  (p=0.100 n=3+3)
CacheNoHitProc/size=128        722ns ± 1%     622ns ± 0%  -13.90%  (p=0.100 n=3+3)
CacheNoHitProc/size=128-4      363ns ± 0%     311ns ± 0%  -14.25%  (p=0.100 n=3+3)
CacheNoHitProc/size=512        741ns ± 1%     640ns ± 0%  -13.67%  (p=0.100 n=3+3)
CacheNoHitProc/size=512-4      394ns ± 0%     331ns ± 0%  -16.06%  (p=0.100 n=3+3)
CacheNoHitProc/size=4096       943ns ± 0%     782ns ± 1%  -17.04%  (p=0.100 n=3+3)
CacheNoHitProc/size=4096-4     565ns ± 0%     462ns ± 0%  -18.28%  (p=0.100 n=3+3)
CacheHitProc/size=0            598ns ± 0%     498ns ± 0%  -16.67%  (p=0.100 n=3+3)
CacheHitProc/size=0-4          310ns ± 0%     291ns ± 0%   -5.92%  (p=0.100 n=3+3)
CacheHitProc/size=16           120ns ± 1%     120ns ± 1%     ~     (p=0.600 n=3+3)
CacheHitProc/size=16-4        57.5ns ± 2%    57.2ns ± 1%     ~     (p=1.000 n=3+3)
CacheHitProc/size=128          123ns ± 1%     123ns ± 1%     ~     (p=1.000 n=3+3)
CacheHitProc/size=128-4       58.1ns ± 0%    57.9ns ± 0%     ~     (p=0.200 n=3+3)
CacheHitProc/size=512          126ns ± 2%     126ns ± 1%     ~     (p=1.000 n=3+3)
CacheHitProc/size=512-4       58.6ns ± 0%    58.6ns ± 0%     ~     (p=1.000 n=3+3)
CacheHitProc/size=4096         128ns ± 1%     127ns ± 1%     ~     (p=1.000 n=3+3)
CacheHitProc/size=4096-4      69.8ns ± 0%    70.6ns ± 1%   +1.15%  (p=0.100 n=3+3)

name                        old alloc/op   new alloc/op   delta
NoopStorage                    0.00B          0.00B          ~     (all equal)
NoopStorage-4                  0.00B          0.00B          ~     (all equal)
CacheStartup                    285B ± 0%      285B ± 0%     ~     (all equal)
CacheStartup-4                  285B ± 0%      285B ± 0%     ~     (all equal)
CacheNoHit/size=0               152B ± 0%       96B ± 0%  -36.84%  (p=0.100 n=3+3)
CacheNoHit/size=0-4             152B ± 0%       96B ± 0%  -36.84%  (p=0.100 n=3+3)
CacheNoHit/size=16              153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHit/size=16-4            153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHit/size=128             153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHit/size=128-4           153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHit/size=512             153B ± 0%       97B ± 0%  -36.46%  (p=0.100 n=3+3)
CacheNoHit/size=512-4           153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHit/size=4096            153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHit/size=4096-4          153B ± 0%       97B ± 0%  -36.46%  (p=0.100 n=3+3)
CacheHit/size=0                 152B ± 0%       96B ± 0%  -36.84%  (p=0.100 n=3+3)
CacheHit/size=0-4               152B ± 0%       96B ± 0%  -36.84%  (p=0.100 n=3+3)
CacheHit/size=16               0.00B          0.00B          ~     (all equal)
CacheHit/size=16-4             0.00B          0.00B          ~     (all equal)
CacheHit/size=128              0.00B          0.00B          ~     (all equal)
CacheHit/size=128-4            0.00B          0.00B          ~     (all equal)
CacheHit/size=512              0.00B          0.00B          ~     (all equal)
CacheHit/size=512-4            0.00B          0.00B          ~     (all equal)
CacheHit/size=4096             0.00B          0.00B          ~     (all equal)
CacheHit/size=4096-4           0.00B          0.00B          ~     (all equal)
NoopStoragePar                 0.00B          0.00B          ~     (all equal)
NoopStoragePar-4               0.00B          0.00B          ~     (all equal)
CacheStartupPar                 285B ± 0%      285B ± 0%     ~     (all equal)
CacheStartupPar-4               282B ± 0%      282B ± 1%     ~     (p=1.000 n=3+3)
CacheNoHitPar/size=0            152B ± 0%       96B ± 0%  -36.84%  (p=0.100 n=3+3)
CacheNoHitPar/size=0-4          152B ± 0%       96B ± 0%  -36.84%  (p=0.100 n=3+3)
CacheNoHitPar/size=16           153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHitPar/size=16-4         154B ± 0%       98B ± 0%  -36.36%  (p=0.100 n=3+3)
CacheNoHitPar/size=128          153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHitPar/size=128-4        153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHitPar/size=512          153B ± 0%       97B ± 1%  -36.82%  (p=0.100 n=3+3)
CacheNoHitPar/size=512-4        153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHitPar/size=4096         153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHitPar/size=4096-4       153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheHitPar/size=0              152B ± 0%       96B ± 0%  -36.84%  (p=0.100 n=3+3)
CacheHitPar/size=0-4            152B ± 0%       96B ± 0%  -36.84%  (p=0.100 n=3+3)
CacheHitPar/size=16            0.00B          0.00B          ~     (all equal)
CacheHitPar/size=16-4          0.00B          0.00B          ~     (all equal)
CacheHitPar/size=128           0.00B          0.00B          ~     (all equal)
CacheHitPar/size=128-4         0.00B          0.00B          ~     (all equal)
CacheHitPar/size=512           0.00B          0.00B          ~     (all equal)
CacheHitPar/size=512-4         0.00B          0.00B          ~     (all equal)
CacheHitPar/size=4096          0.00B          0.00B          ~     (all equal)
CacheHitPar/size=4096-4        0.00B          0.00B          ~     (all equal)
NoopStorageProc                0.00B          0.00B          ~     (all equal)
NoopStorageProc-4              0.00B          0.00B          ~     (all equal)
CacheStartupProc                285B ± 0%      285B ± 0%     ~     (all equal)
CacheStartupProc-4              285B ± 0%      285B ± 0%     ~     (all equal)
CacheNoHitProc/size=0           152B ± 0%       96B ± 0%  -36.84%  (p=0.100 n=3+3)
CacheNoHitProc/size=0-4         152B ± 0%       96B ± 0%  -36.84%  (p=0.100 n=3+3)
CacheNoHitProc/size=16          153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHitProc/size=16-4        153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHitProc/size=128         153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHitProc/size=128-4       153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHitProc/size=512         153B ± 0%       96B ± 1%  -37.04%  (p=0.100 n=3+3)
CacheNoHitProc/size=512-4       153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHitProc/size=4096        153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheNoHitProc/size=4096-4      153B ± 0%       97B ± 0%  -36.60%  (p=0.100 n=3+3)
CacheHitProc/size=0             152B ± 0%       96B ± 0%  -36.84%  (p=0.100 n=3+3)
CacheHitProc/size=0-4           152B ± 0%       96B ± 0%  -36.84%  (p=0.100 n=3+3)
CacheHitProc/size=16           0.00B          0.00B          ~     (all equal)
CacheHitProc/size=16-4         0.00B          0.00B          ~     (all equal)
CacheHitProc/size=128          0.00B          0.00B          ~     (all equal)
CacheHitProc/size=128-4        0.00B          0.00B          ~     (all equal)
CacheHitProc/size=512          0.00B          0.00B          ~     (all equal)
CacheHitProc/size=512-4        0.00B          0.00B          ~     (all equal)
CacheHitProc/size=4096         0.00B          0.00B          ~     (all equal)
CacheHitProc/size=4096-4       0.00B          0.00B          ~     (all equal)

name                        old allocs/op  new allocs/op  delta
NoopStorage                     0.00           0.00          ~     (all equal)
NoopStorage-4                   0.00           0.00          ~     (all equal)
CacheStartup                    5.00 ± 0%      5.00 ± 0%     ~     (all equal)
CacheStartup-4                  5.00 ± 0%      5.00 ± 0%     ~     (all equal)
CacheNoHit/size=0               3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHit/size=0-4             3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHit/size=16              3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHit/size=16-4            3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHit/size=128             3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHit/size=128-4           3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHit/size=512             3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHit/size=512-4           3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHit/size=4096            3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHit/size=4096-4          3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheHit/size=0                 3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheHit/size=0-4               3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheHit/size=16                0.00           0.00          ~     (all equal)
CacheHit/size=16-4              0.00           0.00          ~     (all equal)
CacheHit/size=128               0.00           0.00          ~     (all equal)
CacheHit/size=128-4             0.00           0.00          ~     (all equal)
CacheHit/size=512               0.00           0.00          ~     (all equal)
CacheHit/size=512-4             0.00           0.00          ~     (all equal)
CacheHit/size=4096              0.00           0.00          ~     (all equal)
CacheHit/size=4096-4            0.00           0.00          ~     (all equal)
NoopStoragePar                  0.00           0.00          ~     (all equal)
NoopStoragePar-4                0.00           0.00          ~     (all equal)
CacheStartupPar                 5.00 ± 0%      5.00 ± 0%     ~     (all equal)
CacheStartupPar-4               4.00 ± 0%      4.33 ±15%     ~     (p=1.000 n=3+3)
CacheNoHitPar/size=0            3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitPar/size=0-4          3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitPar/size=16           3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitPar/size=16-4         3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitPar/size=128          3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitPar/size=128-4        3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitPar/size=512          3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitPar/size=512-4        3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitPar/size=4096         3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitPar/size=4096-4       3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheHitPar/size=0              3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheHitPar/size=0-4            3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheHitPar/size=16             0.00           0.00          ~     (all equal)
CacheHitPar/size=16-4           0.00           0.00          ~     (all equal)
CacheHitPar/size=128            0.00           0.00          ~     (all equal)
CacheHitPar/size=128-4          0.00           0.00          ~     (all equal)
CacheHitPar/size=512            0.00           0.00          ~     (all equal)
CacheHitPar/size=512-4          0.00           0.00          ~     (all equal)
CacheHitPar/size=4096           0.00           0.00          ~     (all equal)
CacheHitPar/size=4096-4         0.00           0.00          ~     (all equal)
NoopStorageProc                 0.00           0.00          ~     (all equal)
NoopStorageProc-4               0.00           0.00          ~     (all equal)
CacheStartupProc                5.00 ± 0%      5.00 ± 0%     ~     (all equal)
CacheStartupProc-4              5.00 ± 0%      5.00 ± 0%     ~     (all equal)
CacheNoHitProc/size=0           3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitProc/size=0-4         3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitProc/size=16          3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitProc/size=16-4        3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitProc/size=128         3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitProc/size=128-4       3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitProc/size=512         3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitProc/size=512-4       3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitProc/size=4096        3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheNoHitProc/size=4096-4      3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheHitProc/size=0             3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheHitProc/size=0-4           3.00 ± 0%      1.00 ± 0%  -66.67%  (p=0.100 n=3+3)
CacheHitProc/size=16            0.00           0.00          ~     (all equal)
CacheHitProc/size=16-4          0.00           0.00          ~     (all equal)
CacheHitProc/size=128           0.00           0.00          ~     (all equal)
CacheHitProc/size=128-4         0.00           0.00          ~     (all equal)
CacheHitProc/size=512           0.00           0.00          ~     (all equal)
CacheHitProc/size=512-4         0.00           0.00          ~     (all equal)
CacheHitProc/size=4096          0.00           0.00          ~     (all equal)
CacheHitProc/size=4096-4        0.00           0.00          ~     (all equal)
parent 13f149f0
...@@ -222,7 +222,7 @@ func (c *Cache) lookupRCE(xid Xid, wantBufRef int) (rce *revCacheEntry, rceNew b ...@@ -222,7 +222,7 @@ func (c *Cache) lookupRCE(xid Xid, wantBufRef int) (rce *revCacheEntry, rceNew b
c.mu.Lock() c.mu.Lock()
oce = c.entryMap[xid.Oid] oce = c.entryMap[xid.Oid]
if oce == nil { if oce == nil {
oce = &oidCacheEntry{oid: xid.Oid} oce = oceAlloc(xid.Oid)
c.entryMap[xid.Oid] = oce c.entryMap[xid.Oid] = oce
} }
cacheHead = c.head // reload c.head because we relocked the cache cacheHead = c.head // reload c.head because we relocked the cache
...@@ -516,11 +516,39 @@ func (c *Cache) gc() { ...@@ -516,11 +516,39 @@ func (c *Cache) gc() {
// (it could be looked up again in the meantime we were not holding its lock) // (it could be looked up again in the meantime we were not holding its lock)
if len(oce.rcev) == 0 { if len(oce.rcev) == 0 {
delete(c.entryMap, oce.oid) delete(c.entryMap, oce.oid)
} else {
oceFree = false
} }
oce.Unlock() oce.Unlock()
c.mu.Unlock() c.mu.Unlock()
if oceFree {
oce.release()
} }
} }
}
}
// freelist(OCE)
var ocePool = sync.Pool{New: func() interface{} { return &oidCacheEntry{} } }
// oceAlloc allocates oidCacheEntry from freelist.
func oceAlloc(oid Oid) *oidCacheEntry {
oce := ocePool.Get().(*oidCacheEntry)
oce.oid = oid
return oce
}
// release puts oce back into freelist.
//
// Oce must be empty and caller must not use oce after call to release.
func (oce *oidCacheEntry) release() {
if len(oce.rcev) != 0 {
panic("oce.release: .rcev != []")
}
oce.oid = 0 // just in case
ocePool.Put(oce)
} }
// ---------------------------------------- // ----------------------------------------
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment