25 ClassImp(TProofNodes);
 
   30 TProofNodes::TProofNodes(TProof* proof)
 
   31             : fProof(proof), fNodes(0), fActiveNodes(0),
 
   32               fMaxWrksNode(-1), fMinWrksNode(-1),
 
   33               fNNodes(0), fNWrks(0), fNActiveWrks(0), fNCores(0)
 
   41 TProofNodes::~TProofNodes()
 
   44       fNodes->SetOwner(kTRUE);
 
   55 void TProofNodes::Build()
 
   57    if (!fProof || !fProof->IsValid()) {
 
   58       Warning(
"Build", 
"the PROOF instance is undefined or invalid! Cannot continue");
 
   63       fNodes->SetOwner(kTRUE);
 
   67    fNodes->SetOwner(kTRUE);
 
   69    TList *slaves = fProof->GetListOfSlaveInfos();
 
   70    TIter nxtslave(slaves);
 
   74    while ((si = (TSlaveInfo *)(nxtslave()))) {
 
   75       TSlaveInfo *si_copy = (TSlaveInfo *)(si->Clone());
 
   76       if (!(pair = (TPair *) fNodes->FindObject(si->GetName()))) {
 
   79          node->SetOwner(kTRUE);
 
   80          node->SetName(si_copy->GetName());
 
   82          fNodes->Add(
new TObjString(si->GetName()), node);
 
   84          node = (TList *) pair->Value();
 
   90       fActiveNodes->SetOwner(kTRUE);
 
   91       SafeDelete(fActiveNodes);
 
   93    fActiveNodes = 
new TMap;
 
   94    fActiveNodes->SetOwner(kTRUE);
 
  103    while ((key = nxk()) != 0) {
 
  104       node = 
dynamic_cast<TList *
>(fNodes->GetValue(key));
 
  108          si = (TSlaveInfo *) node->First();
 
  109          fNCores += si->fSysInfo.fCpus;
 
  111          fNWrks += node->GetSize();
 
  112          if (fMinWrksNode == -1 || (node->GetSize() < fMinWrksNode)) {
 
  113             fMinWrksNode = node->GetSize();
 
  115          if (fMaxWrksNode == -1 || (node->GetSize() > fMaxWrksNode)) {
 
  116             fMaxWrksNode = node->GetSize();
 
  119          while ((si = (TSlaveInfo *) nxw())) {
 
  120             if (si->fStatus == TSlaveInfo::kActive) {
 
  122                TSlaveInfo *si_copy = (TSlaveInfo *)(si->Clone());
 
  123                actnode = 
dynamic_cast<TList *
>(fActiveNodes->GetValue(key));
 
  125                   actnode->Add(si_copy);
 
  128                   actnode->SetOwner(kTRUE);
 
  129                   actnode->SetName(si_copy->GetName());
 
  130                   actnode->Add(si_copy);
 
  131                   fActiveNodes->Add(
new TObjString(si->GetName()), actnode);
 
  136          Warning(
"Build", 
"could not get list for node '%s'", key->GetName());
 
  150 Int_t TProofNodes::ActivateWorkers(Int_t nwrks)
 
  152    Int_t nw = fProof->SetParallel(nwrks);
 
  155          Warning(
"ActivateWorkers", 
"requested %d got %d", nwrks, nw);
 
  169 Int_t TProofNodes::ActivateWorkers(
const char *workers)
 
  172    TString todeactivate;
 
  176    Bool_t protocol33 = kTRUE;
 
  177    if (fProof->GetRemoteProtocol() < 33 || fProof->GetClientProtocol() < 33) {
 
  180       fProof->SetParallel(0);
 
  186    TString sworkers = TString(workers).Strip(TString::kTrailing, 
'x');
 
  187    if (!sworkers.IsDigit()) {
 
  188       Error(
"ActivateWorkers", 
"wrongly formatted argument: %s - cannot continue", workers);
 
  191    Int_t nworkersnode = sworkers.Atoi();
 
  192    Int_t ret = nworkersnode;
 
  198    while ((key = nxk()) != 0) {
 
  199       if ((node = dynamic_cast<TList *>(fNodes->GetValue(key)))) {
 
  200          TIter nxtworker(node);
 
  201          Int_t nactiveworkers = 0;
 
  202          while ((si = (TSlaveInfo *)(nxtworker()))) {
 
  203             if (nactiveworkers < nworkersnode) {
 
  204                if (si->fStatus == TSlaveInfo::kNotActive) {
 
  206                       toactivate += TString::Format(
"%s,", si->GetOrdinal());
 
  208                      fProof->ActivateWorker(si->GetOrdinal());
 
  213                if (si->fStatus == TSlaveInfo::kActive) {
 
  215                       todeactivate += TString::Format(
"%s,", si->GetOrdinal());
 
  217                      fProof->DeactivateWorker(si->GetOrdinal());
 
  223          Warning(
"ActivateWorkers", 
"could not get list for node '%s'", key->GetName());
 
  227    if (!todeactivate.IsNull()) {
 
  228       todeactivate.Remove(TString::kTrailing, 
',');
 
  229       if (fProof->DeactivateWorker(todeactivate) < 0) ret = -1;
 
  231    if (!toactivate.IsNull()) {
 
  232       toactivate.Remove(TString::kTrailing, 
',');
 
  233       if (fProof->ActivateWorker(toactivate) < 0) ret = -1;
 
  236       Warning(
"ActivateWorkers", 
"could not get the requested number of workers per node (%d)",
 
  246    while ((key = nxkn()) != 0) {
 
  247       if ((node = dynamic_cast<TList *>(fNodes->GetValue(key)))) {
 
  248          TIter nxtworker(node);
 
  249          Int_t nactiveworkers = 0;
 
  250          while ((si = (TSlaveInfo *)(nxtworker()))) {
 
  251             if (si->fStatus == TSlaveInfo::kActive) nactiveworkers++;
 
  253          if (nactiveworkers != nworkersnode) {
 
  254             Warning(
"ActivateWorkers", 
"only %d (out of %d requested) workers " 
  255                                        "were activated on node %s",
 
  256                                        nactiveworkers, nworkersnode, node->GetName());
 
  260          Warning(
"ActivateWorkers", 
"could not get list for node '%s'", key->GetName());
 
  271 void TProofNodes::Print(Option_t* option)
 const 
  275    while ((key = nxk()) != 0) {
 
  276       TList *node = 
dynamic_cast<TList *
>(fNodes->GetValue(key));
 
  280          Warning(
"Print", 
"could not get list for node '%s'", key->GetName());