diff options
author | wolff1 <wolff1@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2009-05-01 16:43:50 +0000 |
---|---|---|
committer | wolff1 <wolff1@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2009-05-01 16:43:50 +0000 |
commit | 25fdb011c3e9c46e0ac834ea71a540b6bfc8e3a2 (patch) | |
tree | d3d00ffa28f27788ca78878200faacdb7e7ba42c | |
parent | 19f1c99ce68df8edb661c014ac20105050bd76d5 (diff) | |
download | ATCD-25fdb011c3e9c46e0ac834ea71a540b6bfc8e3a2.tar.gz |
changed schedulability test
6 files changed, 51 insertions, 64 deletions
diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/DeCoRAM.mpc b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/DeCoRAM.mpc index c58fc7e0f9e..44030dada22 100644 --- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/DeCoRAM.mpc +++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/DeCoRAM.mpc @@ -219,7 +219,7 @@ project (schedulability_check) : acelib { exename = scheck exeout = ../bin - macros += DO_DEBUG + macros += DO_DEBUG // DO_TRACE Source_Files { Algorithms.cpp diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Bestfit.cpp b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Bestfit.cpp index 4167ea537b8..dd7091c0219 100644 --- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Bestfit.cpp +++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Bestfit.cpp @@ -16,11 +16,6 @@ #include "Forward_Ranking_Scheduler.h" #include "Packing_Scheduler.h" -FTRMFF_Bestfit::FTRMFF_Bestfit (const std::string & algorithm) - : algorithm_ (algorithm) -{ -} - FTRMFF_Bestfit::~FTRMFF_Bestfit () { } @@ -29,8 +24,7 @@ FTRMFF_Output FTRMFF_Bestfit::operator () (const FTRMFF_Input & input) { FTRMFF_Bestfit_Algorithm algorithm (input.processors, - input.backup_count, - algorithm_); + input.backup_count); FTRMFF_Output output; output.schedule = algorithm (input.tasks); @@ -43,8 +37,7 @@ FTRMFF_Bestfit::operator () (const FTRMFF_Input & input) FTRMFF_Bestfit_Algorithm::FTRMFF_Bestfit_Algorithm ( const PROCESSOR_LIST & processors, - unsigned int consistency_level, - const std::string & scheduler) + unsigned int consistency_level) : consistency_level_ (consistency_level), scheduler_ (processors, consistency_level_) diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Bestfit.h b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Bestfit.h index c46109c0457..31f7e2810ed 100644 --- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Bestfit.h +++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FTRMFF_Bestfit.h @@ -18,13 +18,9 @@ class FTRMFF_Bestfit : public FTRMFF_Algorithm { public: - FTRMFF_Bestfit (const std::string & algorithm = "Bestfit"); - virtual ~FTRMFF_Bestfit (); virtual FTRMFF_Output operator () (const FTRMFF_Input & input); -private: - std::string algorithm_; }; class FTRMFF_Bestfit_Algorithm : @@ -33,8 +29,7 @@ class FTRMFF_Bestfit_Algorithm : { public: FTRMFF_Bestfit_Algorithm (const PROCESSOR_LIST & processors, - unsigned int consistency_level, - const std::string & scheduler); + unsigned int consistency_level); virtual ~FTRMFF_Bestfit_Algorithm (); diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FailureAwareWCRT.cpp b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FailureAwareWCRT.cpp index f0e96ce07a2..20730846d4b 100644 --- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FailureAwareWCRT.cpp +++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/FailureAwareWCRT.cpp @@ -26,14 +26,19 @@ FailureAwareWCRT::operator () (double previous, { // find all tasks that need to become active std::set<Taskname> active_tasks; + for (TASK_LIST::iterator t_it = tasks_.begin (); t_it != tasks_.end (); ++t_it) { + TRACE (*t_it); + // check in the replica map if all previous tasks get activated // and switch the task to primary if this is the case PROCESSOR_SET necessary_failures = replica_finder_ (*t_it); + TRACE (necessary_failures); + PROCESSOR_SET difference; std::set_intersection (failures.begin (), failures.end (), diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.cpp b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.cpp index e9a77176288..6259c589785 100644 --- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.cpp +++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/Scheduler.cpp @@ -119,6 +119,9 @@ PROCESSOR_SET ReplicaFinder::operator () (const Task & task) const { PROCESSOR_SET result; + + TRACE ("TEST"); + TRACE (rep_groups_); REPLICA_GROUPS::const_iterator replicas = rep_groups_.find (primary_name (task)); diff --git a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/schedulability_check.cpp b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/schedulability_check.cpp index cd57eda5114..ba81c31dd68 100644 --- a/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/schedulability_check.cpp +++ b/TAO/orbsvcs/examples/FaultTolerance/FLARe/DeCoRAM/src/schedulability_check.cpp @@ -27,13 +27,14 @@ bool average_mode = false; bool check_overbooking = false; unsigned int consistency_level = 0; -class ScheduleChecker : public std::binary_function <double, - SCHEDULE::value_type, - double> +typedef std::map <Processor, FailureAwareWCRT> WCRT_MAP; + +class ScheduleChecker { public: ScheduleChecker (const SCHEDULE & schedule) - : schedule_ (schedule) + : schedule_ (schedule), + replica_finder_ (replica_groups_) { max_rank_ = this->max_rank (); @@ -63,41 +64,23 @@ public: primary_name (*task_it)].push_back (position); } } + + // fill wcrt_map + wcrt_map_.insert (std::pair <Processor, FailureAwareWCRT> ( + processor, + FailureAwareWCRT (sched_it->second, + replica_finder_))); } - } - double operator () (double previous, const SCHEDULE::value_type & entry) - { - if (previous == .0) - return .0; - - PROCESSOR_SETS scenarios = - this->calculate_failure_scenarions (entry.first, - max_rank_); - - return std::max(std::accumulate (scenarios.begin (), - scenarios.end (), - -1.0, - FailureAwareWCRT (entry.second, - replica_groups_)), - previous); + + } -private: - PROCESSOR_SETS calculate_failure_scenarions (const Processor & processor, - unsigned int consistency_level) + int check_schedulability (void) { - PROCESSOR_SETS result; PROCESSOR_LIST all_processors = get_processors (schedule_, true); - // remove current processor - PROCESSOR_LIST::iterator myprocessor = std::find (all_processors.begin (), - all_processors.end (), - processor); - - all_processors.erase (myprocessor); - - unsigned int tupel_size = std::min (consistency_level, + unsigned int tupel_size = std::min (max_rank_, (unsigned int) all_processors.size ()); PROCESSOR_LIST combination; @@ -112,22 +95,39 @@ private: do { PROCESSOR_SET set; - // add a permutation of the relevant failures std::copy (combination.begin (), combination.end (), std::inserter (set, set.begin ())); + + // check combination against each task; + for (WCRT_MAP::iterator wcrt_it = wcrt_map_.begin (); + wcrt_it != wcrt_map_.end (); + ++wcrt_it) + { + // ignore failure sets that contain the own processor + if (set.find (wcrt_it->first) != set.end ()) + continue; + + DBG_OUT ("checking " << wcrt_it->first << " with " << set); - result.push_back (set); + double wcrt = (wcrt_it->second) (-1.0, set); + if (!(wcrt > .0)) + { + DBG_OUT (wcrt_it->first << " not schedulable with " << set << ": " << wcrt); + return 1; + } + } } while (next_combination (all_processors.begin (), all_processors.end (), combination.begin (), combination.end ())); - return result; + return 0; } +private: unsigned int max_rank (void) { unsigned int max_rank = 0; @@ -151,6 +151,8 @@ private: private: const SCHEDULE & schedule_; REPLICA_GROUPS replica_groups_; + ReplicaFinder replica_finder_; + WCRT_MAP wcrt_map_; unsigned int max_rank_; }; @@ -253,19 +255,8 @@ int main (int argc, char *argv[]) } ScheduleChecker checker (min_schedule); - double wcrt = -1.0; - for (SCHEDULE::iterator it = min_schedule.begin (); - it != min_schedule.end (); - ++it) - { - wcrt = checker (wcrt, *it); - if (wcrt > .0) - DBG_OUT (it->first << ": " << "(" << wcrt << "," << (--(it->second.end ()))->period << ")"); - else - DBG_OUT (it->first << ": not schedulable"); - } - - return wcrt > .0; + + return checker.check_schedulability (); } // end else counting_mode not true return 0; |