Changeset 471 for CMT


Ignore:
Timestamp:
Nov 1, 2008, 5:52:16 PM (16 years ago)
Author:
rybkin
Message:

See C.L. 372

Location:
CMT/HEAD
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • CMT/HEAD/ChangeLog

    r470 r471  
     12008-11-01    <rybkin@lal.in2p3.fr> 372
     2       
     3        * source/cmt_project.h: Optimise performance of the previous change. In
     4        class Project, change method ordered_projects to return ProjectPtrVector,
     5        add method visit (int&, ProjectPtrVector&), add member m_order
     6        * source/cmt_project.cxx: Implement method visit (int&, ProjectPtrVector&),
     7        make use of it to re-implement method Project::ordered_projects, use the
     8        latter in Project::fill_cmtpaths
     9       
    1102008-10-30    <rybkin@lal.in2p3.fr> 371
    211       
  • CMT/HEAD/source/cmt_project.cxx

    r470 r471  
    901901
    902902//----------------------------------------------------------
    903 Project::ProjectVector& Project::ordered_projects ()
    904 {
    905   static ProjectVector OrderedProjects;
    906   if (0 != OrderedProjects.size ()) return (OrderedProjects);
    907 
    908   cmt_string s = Symbol::get_env_value ("CMTPATH");
    909   CmtSystem::cmt_string_vector path_vector;
    910   CmtSystem::split (s, CmtSystem::path_separator (), path_vector);
    911 
    912   for (int i = 0; i < path_vector.size (); i++)
    913     {
    914       const cmt_string& path = path_vector[i];
    915       Project* p = Project::find_by_cmtpath (path);
    916       if (0 != p)
    917         {
    918           OrderedProjects.push_back (*p);
    919         }
    920       else
     903Project::ProjectPtrVector Project::ordered_projects ()
     904{
     905  static ProjectPtrVector OrderedProjects;
     906  if (0 != OrderedProjects.size ()) return OrderedProjects;
     907
     908  Project::ProjectVector& Projects = Project::projects ();
     909  int size = Projects.size ();
     910 
     911  for (int i = 0; i < size; i++)
     912    {
     913      Project& p = Projects[i];
     914      //    p.m_visited = false;
     915      p.m_order = -1;
     916      p.m_visits = 0;
     917    }
     918
     919  Project* p = get_current ();
     920
     921  if (p == 0)
     922    {
     923      if (0 == size) return OrderedProjects;
     924
     925      p = &(Projects[0]);
     926    }
     927
     928  ProjectPtrVector projs;
     929
     930  int order (-1);
     931  p->m_order = ++order;
     932  p->m_visits++;
     933  projs.push_back (p);
     934
     935  visit (order, projs);
     936
     937  OrderedProjects.resize (order + 1);
     938  for (int i = 0; i < size; i++)
     939    {
     940      Project* p = &(Projects[i]);
     941      int j = p->m_order;
     942      if (-1 == j)
    921943        {
    922944          if (CmtMessage::active (Verbose))
    923             CmtMessage::warning ("No project for CMTPATH entry `" + path + "'");
    924         }
    925     }
    926 
    927   return (OrderedProjects);
     945            CmtMessage::warning ("Not ordered project " + p->get_name () +
     946                                 " in path " + p->get_cmtpath_pwd () +
     947                                 " from " + p->get_cmtpath_source ());
     948          continue;
     949        }
     950      OrderedProjects[j] = p;
     951    }
     952
     953  return OrderedProjects;
    928954}
    929955
     
    10881114void Project::broadcast (IProjectAction& action)
    10891115{
    1090   //  static ProjectVector& Projects = projects ();
    1091   static ProjectVector& Projects = ordered_projects ();
     1116  static ProjectPtrVector Projects = Project::ordered_projects ();
    10921117
    10931118  for (int i = 0; i < Projects.size (); i++)
    10941119    {
     1120      const Project* project = Projects[i];
     1121
     1122      if (!action.run (*project)) break;
     1123    }
     1124  /*
     1125  static ProjectVector& Projects = projects ();
     1126
     1127  for (int i = 0; i < Projects.size (); i++)
     1128    {
    10951129      const Project& project = Projects[i];
    10961130
    10971131      if (!action.run (project)) break;
    10981132    }
     1133  */
    10991134}
    11001135
     
    11021137void Project::reverse_broadcast (IProjectAction& action)
    11031138{
    1104   //  static ProjectVector& Projects = projects ();
    1105   static ProjectVector& Projects = ordered_projects ();
     1139  static ProjectPtrVector Projects = Project::ordered_projects ();
    11061140
    11071141  for (int i = (Projects.size () - 1); i >= 0; i--)
    11081142    {
     1143      const Project* project = Projects[i];
     1144
     1145      if (!action.run (*project)) break;
     1146    }
     1147  /*
     1148  static ProjectVector& Projects = projects ();
     1149
     1150  for (int i = (Projects.size () - 1); i >= 0; i--)
     1151    {
    11091152      const Project& project = Projects[i];
    11101153
    11111154      if (!action.run (project)) break;
    11121155    }
     1156  */
    11131157}
    11141158
     
    12571301
    12581302//----------------------------------------------------------
     1303/**
     1304 *  Visit the projects tree and order the projects.
     1305 *  Order is the projects upon which the project depends directly,
     1306 *  then the direct dependencies of the of the first dependency, of the second
     1307 *  dependency and so on. That is first left to right, then downwards.
     1308 *  @param order the order of the last project visited
     1309 *  @param projs vector of projects to visit and order
     1310 */
     1311void Project::visit (int& order, ProjectPtrVector& projs)
     1312{
     1313  int size = projs.size ();
     1314  if (0 == size) return;
     1315  static ProjectVector& all = Project::projects ();
     1316
     1317  ProjectPtrVector children;
     1318  for (int j = 0; j < size; j++)
     1319    {
     1320      Project* p = projs[j];
     1321      // Avoid looping in case of circular project dependencies
     1322      if (100 <= p->m_visits)
     1323        continue;
     1324      for (int i = 0; i < p->get_children_size (); i++)
     1325        {
     1326          Project* child = p->get_child (i);
     1327          const int chorder = child->m_order;
     1328          if (-1 == chorder) // not ordered yet, i.e. visited for the first time
     1329            child->m_order = ++order;
     1330          else
     1331            { // ordered already, want to put it last in the order
     1332              for (int k = 0; k < all.size (); k++)
     1333                {
     1334                  Project& q = all[k];
     1335                  if (q.m_order == chorder)
     1336                    q.m_order = order;
     1337                  else if (q.m_order > chorder)
     1338                    q.m_order--;
     1339                }
     1340            }
     1341          child->m_visits++;
     1342          children.push_back (child);
     1343        }
     1344    }
     1345
     1346  visit (order, children);
     1347}
     1348
     1349//----------------------------------------------------------
    12591350void Project::start_visit (IProjectVisitor& visitor)
    12601351{
     
    12821373  visitor.in (p);
    12831374  p->m_visits++;
    1284   ProjectPtrVector projects;
    1285   projects.push_back (p);
    1286   visit (visitor, projects);
     1375  ProjectPtrVector projs;
     1376  projs.push_back (p);
     1377  visit (visitor, projs);
    12871378}
    12881379
     
    13631454  */
    13641455
     1456  /*
    13651457  VisitorForFillCMTPATH visitor (buffer);
    13661458
    13671459  start_visit (visitor);
     1460  */
     1461  const ProjectPtrVector Ordered = Project::ordered_projects ();
     1462
     1463  buffer = "path CMTPATH \"\" \n";
     1464  for (int i = 0; i < Ordered.size (); i++)
     1465    {
     1466      const Project* p = Ordered[i];
     1467      const cmt_string& w = p->get_cmtpath_pwd ();
     1468      const cmt_string& s = p->get_cmtpath_source ();
     1469     
     1470      if (s == "default path") continue;
     1471     
     1472      if (CmtSystem::test_directory (w))
     1473        {
     1474          buffer += "path_append CMTPATH \"";
     1475          buffer += w;
     1476          buffer += "\" \n";
     1477        }
     1478    }
    13681479}
    13691480
  • CMT/HEAD/source/cmt_project.h

    r470 r471  
    109109
    110110  static ProjectVector& projects ();
    111   static ProjectVector& ordered_projects ();
     111  static ProjectPtrVector ordered_projects ();
    112112  static void clear_all ();
    113113  static void show_all ();
     
    192192  void   visit (IProjectVisitor& visitor);
    193193  static  void   visit (IProjectVisitor& visitor, ProjectPtrVector& projects);
     194  static  void   visit (int& order, ProjectPtrVector& projects);
    194195 
    195196  // Use
     
    214215  bool m_visited;
    215216  int m_visits;
     217  int m_order;
    216218
    217219  cmt_string m_cmtpath;
Note: See TracChangeset for help on using the changeset viewer.