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();