File indexing completed on 2024-04-06 12:13:01
0001 #include "TClass.h"
0002 #include "TThread.h"
0003 #include "TObject.h"
0004 #include "TVirtualStreamerInfo.h"
0005 #include <thread>
0006 #include <memory>
0007 #include <atomic>
0008 #include <cassert>
0009 #include <iostream>
0010
0011 void printHelp(const char* iName, int iDefaultNThreads)
0012 {
0013 std::cout << iName <<" [number of threads] \n\n"
0014 <<"If no arguments are given "<<iDefaultNThreads<<" threads will be used"<<std::endl;
0015 }
0016
0017 int parseOptionsForNumberOfThreads(int argc, char** argv)
0018 {
0019 constexpr int kDefaultNThreads = 4;
0020 int returnValue = kDefaultNThreads;
0021 if( argc == 2 ) {
0022 if(strcmp("-h",argv[1]) ==0) {
0023 printHelp(argv[0],kDefaultNThreads);
0024 exit( 0 );
0025 }
0026
0027 returnValue = atoi(argv[1]);
0028 }
0029
0030 if( argc > 2) {
0031 printHelp(argv[0],kDefaultNThreads);
0032 exit(1);
0033 }
0034 return returnValue ;
0035 }
0036
0037 int main(int argc, char** argv)
0038 {
0039 const int kNThreads = parseOptionsForNumberOfThreads(argc,argv);
0040
0041 std::atomic<bool> canStart{false};
0042 std::vector<std::thread> threads;
0043
0044 std::atomic<int> classWasGotten{0};
0045 std::atomic<int> firstMethodGotten{0};
0046
0047 TThread::Initialize();
0048
0049 TObject::SetObjectStat(false);
0050
0051
0052 TVirtualStreamerInfo::Optimize(false);
0053
0054
0055 for(int i=0; i<kNThreads; ++i) {
0056 threads.emplace_back([&canStart,&classWasGotten,&firstMethodGotten]() {
0057 static thread_local TThread guard;
0058 ++classWasGotten;
0059 ++firstMethodGotten;
0060 while(not canStart) {}
0061 auto thingClass = TClass::GetClass("edmtest::Simple");
0062 --classWasGotten;
0063 while(classWasGotten !=0) {}
0064
0065 TMethod* method = thingClass->GetMethodWithPrototype("id","",true , ROOT::kConversionMatch);
0066 --firstMethodGotten;
0067 while(firstMethodGotten !=0) {}
0068 TMethod* method2 = thingClass->GetMethodWithPrototype("operator=","edmtest::Simple const&",false , ROOT::kConversionMatch);
0069
0070 assert(nullptr != method);
0071 assert(nullptr != method2);
0072 });
0073 }
0074 canStart = true;
0075
0076 for(auto& thread: threads) {
0077 thread.join();
0078 }
0079
0080 return 0;
0081 }