@@ -1243,7 +1243,7 @@ TBasket* TBranch::GetBasketImpl(Int_t basketnumber, TBuffer *user_buffer)
1243
1243
// if cluster pre-fetching or retaining is on, do not re-use existing baskets
1244
1244
// unless a new cluster is used.
1245
1245
if (fTree ->GetMaxVirtualSize () < 0 || fTree ->GetClusterPrefetch ())
1246
- basket = GetFreshCluster ();
1246
+ basket = GetFreshCluster (user_buffer );
1247
1247
else
1248
1248
basket = GetFreshBasket (basketnumber, user_buffer);
1249
1249
@@ -1888,23 +1888,36 @@ TBasket* TBranch::GetFreshBasket(Int_t basketnumber, TBuffer* user_buffer)
1888
1888
// / Drops the cluster two behind the current cluster and returns a fresh basket
1889
1889
// / by either reusing or creating a new one
1890
1890
1891
- TBasket *TBranch::GetFreshCluster ()
1891
+ TBasket *TBranch::GetFreshCluster (TBuffer* user_buffer )
1892
1892
{
1893
1893
TBasket *basket = 0 ;
1894
1894
1895
+ auto CreateOrReuseBasket = [this , user_buffer]() -> TBasket* {
1896
+ TBasket *newbasket = nullptr ;
1897
+ if (fExtraBasket ) {
1898
+ newbasket = fExtraBasket ;
1899
+ fExtraBasket = nullptr ;
1900
+ } else {
1901
+ newbasket = fTree ->CreateBasket (this );
1902
+ }
1903
+ if (user_buffer)
1904
+ newbasket->AdoptBuffer (user_buffer);
1905
+ return newbasket;
1906
+ };
1907
+
1895
1908
// If GetClusterIterator is called with a negative entry then GetStartEntry will be 0
1896
1909
// So we need to check if we reach the zero before we have gone back (1-VirtualSize) clusters
1897
1910
// if this is the case, we want to keep everything in memory so we return a new basket
1898
1911
TTree::TClusterIterator iter = fTree ->GetClusterIterator (fBasketEntry [fReadBasket ]);
1899
1912
if (iter.GetStartEntry () == 0 ) {
1900
- return fTree -> CreateBasket ( this );
1913
+ return CreateOrReuseBasket ( );
1901
1914
}
1902
1915
1903
1916
// Iterate backwards (1-VirtualSize) clusters to reach cluster to be unloaded from memory,
1904
1917
// skipped if VirtualSize > 0.
1905
1918
for (Int_t j = 0 ; j < -fTree ->GetMaxVirtualSize (); j++) {
1906
1919
if (iter.Previous () == 0 ) {
1907
- return fTree -> CreateBasket ( this );
1920
+ return CreateOrReuseBasket ( );
1908
1921
}
1909
1922
}
1910
1923
@@ -1916,7 +1929,7 @@ TBasket *TBranch::GetFreshCluster()
1916
1929
while (fBasketEntry [basketToUnload] != entryToUnload) {
1917
1930
basketToUnload--;
1918
1931
if (basketToUnload < 0 ) {
1919
- return fTree -> CreateBasket ( this );
1932
+ return CreateOrReuseBasket ( );
1920
1933
}
1921
1934
}
1922
1935
@@ -1927,7 +1940,7 @@ TBasket *TBranch::GetFreshCluster()
1927
1940
fBaskets .AddAt (0 , basketToUnload);
1928
1941
--fNBaskets ;
1929
1942
} else {
1930
- basket = fTree -> CreateBasket ( this );
1943
+ basket = CreateOrReuseBasket ( );
1931
1944
}
1932
1945
++basketToUnload;
1933
1946
0 commit comments