00001 00018 #ifndef _genericarbiter_cc_INC 00019 #define _genericarbiter_cc_INC 00020 00021 #include "genericArbiter.h" 00022 00023 GenericArbiter::GenericArbiter() 00024 { 00025 name = "GenericArbiter"; 00026 address = -1; 00027 node_ip = -1; 00028 last_winner = -1; 00029 done = false; 00030 } /* ----- end of function GenericArbiter ----- */ 00031 00032 GenericArbiter::~GenericArbiter() 00033 { 00034 00035 } 00036 00037 void 00038 GenericArbiter::set_no_requestors(uint ch) 00039 { 00040 vcs = ch; 00041 requests.resize(ch); 00042 for ( uint i=0 ; i<ch ; i++ ) 00043 requests[i] = false; 00044 } 00045 00046 void 00047 GenericArbiter::request( uint ch) 00048 { 00049 requests[ch] = true; 00050 done = false; 00051 return; 00052 } 00053 00054 bool 00055 GenericArbiter::is_requested( uint ch) 00056 { 00057 assert(ch<requests.size()); 00058 return requests[ch]; 00059 } 00060 00061 bool 00062 GenericArbiter::is_empty() 00063 { 00064 for ( uint i=0; i<vcs; i++) 00065 { 00066 if( requests[i] ) 00067 return false; 00068 } 00069 return true; 00070 } 00071 00072 uint 00073 GenericArbiter::get_no_requestors() 00074 { 00075 uint no =0; 00076 for ( uint i=0; i<vcs; i++) 00077 if ( requests[i] ) 00078 no++; 00079 00080 return no; 00081 } 00082 00083 void 00084 GenericArbiter::clear_winner() 00085 { 00086 done = false; 00087 requests[last_winner] = false; 00088 return; 00089 } 00090 00091 uint 00092 GenericArbiter::pick_winner() 00093 { 00094 if(!done) 00095 { 00096 done = true; 00097 for ( uint i=last_winner+1 ; i<requests.size() ; i++ ) 00098 if ( requests[i] ) 00099 { 00100 last_winner = i; 00101 return i; 00102 } 00103 00104 for ( uint i=0 ; i<last_winner+1 ; i++ ) 00105 if ( requests[i]) 00106 { 00107 last_winner = i; 00108 return i; 00109 } 00110 } 00111 else 00112 return last_winner; 00113 00114 printf("Was requested to pick winner but dint find a winner " ); 00115 00116 return -1; 00117 } 00118 00119 string 00120 GenericArbiter::toString () const 00121 { 00122 stringstream str; 00123 str << "GenericArbiter: " 00124 << "\t last_winner: " << last_winner 00125 << "\t no of requests: " << requests.size(); 00126 return str.str(); 00127 } 00128 00129 #endif /* ----- #ifndef _genericarbiter_cc_INC ----- */ 00130