22 namespace Experimental {
 
   24 TBufferMerger::TBufferMerger(
const char *name, Option_t *option, Int_t compress)
 
   28    TDirectory::TContext ctxt;
 
   29    Init(std::unique_ptr<TFile>(TFile::Open(name, option,  name, compress)));
 
   32 TBufferMerger::TBufferMerger(std::unique_ptr<TFile> output)
 
   34    Init(std::move(output));
 
   37 void TBufferMerger::Init(std::unique_ptr<TFile> output)
 
   39    if (!output || !output->IsWritable() || output->IsZombie())
 
   40       Error(
"TBufferMerger", 
"cannot write to output file");
 
   42    fMerger.OutputFile(std::move(output));
 
   45 TBufferMerger::~TBufferMerger()
 
   47    for (
const auto &f : fAttachedFiles)
 
   48       if (!f.expired()) Fatal(
"TBufferMerger", 
" TBufferMergerFiles must be destroyed before the server");
 
   54 std::shared_ptr<TBufferMergerFile> TBufferMerger::GetFile()
 
   56    R__LOCKGUARD(gROOTMutex);
 
   57    std::shared_ptr<TBufferMergerFile> f(
new TBufferMergerFile(*
this));
 
   58    gROOT->GetListOfFiles()->Remove(f.get());
 
   59    fAttachedFiles.push_back(f);
 
   63 size_t TBufferMerger::GetQueueSize()
 const 
   68 void TBufferMerger::Push(TBufferFile *buffer)
 
   71       std::lock_guard<std::mutex> lock(fQueueMutex);
 
   72       fBuffered += buffer->BufferSize();
 
   76    if (fBuffered > fAutoSave)
 
   80 size_t TBufferMerger::GetAutoSave()
 const 
   85 const char *TBufferMerger::GetMergeOptions()
 
   87    return fMerger.GetMergeOptions();
 
   91 void TBufferMerger::SetAutoSave(
size_t size)
 
   96 void TBufferMerger::SetMergeOptions(
const TString& options)
 
   98    fMerger.SetMergeOptions(options);
 
  101 void TBufferMerger::Merge()
 
  103    if (fMergeMutex.try_lock()) {
 
  104       std::queue<TBufferFile *> queue;
 
  106          std::lock_guard<std::mutex> q(fQueueMutex);
 
  107          std::swap(queue, fQueue);
 
  111       while (!queue.empty()) {
 
  112          std::unique_ptr<TBufferFile> buffer{queue.front()};
 
  113          fMerger.AddAdoptFile(
new TMemFile(fMerger.GetOutputFileName(), std::move(buffer)));
 
  117       fMerger.PartialMerge();
 
  119       fMergeMutex.unlock();