Changeset 471
- Timestamp:
- Nov 1, 2008, 5:52:16 PM (16 years ago)
- Location:
- CMT/HEAD
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
CMT/HEAD/ChangeLog
r470 r471 1 2008-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 1 10 2008-10-30 <rybkin@lal.in2p3.fr> 371 2 11 -
CMT/HEAD/source/cmt_project.cxx
r470 r471 901 901 902 902 //---------------------------------------------------------- 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 903 Project::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) 921 943 { 922 944 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; 928 954 } 929 955 … … 1088 1114 void Project::broadcast (IProjectAction& action) 1089 1115 { 1090 // static ProjectVector& Projects = projects (); 1091 static ProjectVector& Projects = ordered_projects (); 1116 static ProjectPtrVector Projects = Project::ordered_projects (); 1092 1117 1093 1118 for (int i = 0; i < Projects.size (); i++) 1094 1119 { 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 { 1095 1129 const Project& project = Projects[i]; 1096 1130 1097 1131 if (!action.run (project)) break; 1098 1132 } 1133 */ 1099 1134 } 1100 1135 … … 1102 1137 void Project::reverse_broadcast (IProjectAction& action) 1103 1138 { 1104 // static ProjectVector& Projects = projects (); 1105 static ProjectVector& Projects = ordered_projects (); 1139 static ProjectPtrVector Projects = Project::ordered_projects (); 1106 1140 1107 1141 for (int i = (Projects.size () - 1); i >= 0; i--) 1108 1142 { 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 { 1109 1152 const Project& project = Projects[i]; 1110 1153 1111 1154 if (!action.run (project)) break; 1112 1155 } 1156 */ 1113 1157 } 1114 1158 … … 1257 1301 1258 1302 //---------------------------------------------------------- 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 */ 1311 void 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 //---------------------------------------------------------- 1259 1350 void Project::start_visit (IProjectVisitor& visitor) 1260 1351 { … … 1282 1373 visitor.in (p); 1283 1374 p->m_visits++; 1284 ProjectPtrVector proj ects;1285 proj ects.push_back (p);1286 visit (visitor, proj ects);1375 ProjectPtrVector projs; 1376 projs.push_back (p); 1377 visit (visitor, projs); 1287 1378 } 1288 1379 … … 1363 1454 */ 1364 1455 1456 /* 1365 1457 VisitorForFillCMTPATH visitor (buffer); 1366 1458 1367 1459 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 } 1368 1479 } 1369 1480 -
CMT/HEAD/source/cmt_project.h
r470 r471 109 109 110 110 static ProjectVector& projects (); 111 static Project Vector&ordered_projects ();111 static ProjectPtrVector ordered_projects (); 112 112 static void clear_all (); 113 113 static void show_all (); … … 192 192 void visit (IProjectVisitor& visitor); 193 193 static void visit (IProjectVisitor& visitor, ProjectPtrVector& projects); 194 static void visit (int& order, ProjectPtrVector& projects); 194 195 195 196 // Use … … 214 215 bool m_visited; 215 216 int m_visits; 217 int m_order; 216 218 217 219 cmt_string m_cmtpath;
Note: See TracChangeset
for help on using the changeset viewer.