Changeset 3626 in Sophya for trunk/AddOn/TAcq/racqumem.cc
- Timestamp:
- May 22, 2009, 6:18:06 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/AddOn/TAcq/racqumem.cc
r3623 r3626 6 6 //---------------------------------------------------------------- 7 7 8 8 /* --Methode-- */ 9 9 RAcqMemZoneMgr::RAcqMemZoneMgr(uint_4 nz, uint_4 np, uint_4 psz) 10 10 : mex(true), nzones(nz), npaq(np), paqsz(psz), stop_(false) … … 12 12 St_MemZ st; 13 13 14 st.serial = 0; 14 15 st.act = (uint_4)MemZA_None; 15 st.stat = (uint_ 8)MemZS_Free;16 for(int k=0; k< 3; k++) st.nbact[k] = 0;16 st.stat = (uint_4)MemZS_Free; 17 for(int k=0; k<6; k++) st.nbact[k] = 0; 17 18 uint_8 mzsz = npaq*paqsz; 18 19 … … 21 22 states.push_back(st); 22 23 } 23 24 serial_ = 0; 25 SetFinalizedMask(); 24 26 } 25 27 28 /* --Methode-- */ 26 29 RAcqMemZoneMgr::~RAcqMemZoneMgr() 27 30 { … … 29 32 } 30 33 34 /* --Methode-- */ 31 35 int RAcqMemZoneMgr::FindMemZoneId(MemZaction act) 36 // Recherche et renvoie une zone memoire compatible pour effectuer l'operation act 37 // Pour act = MemZA_Fill : Zone vide ou satisfaisant la condition mask_finalized_ 38 // On recherche a chaque fois la zone ayant le plus petit numero de serie 39 // cad le numero d'ordre de remplissage 40 // Pour ProcA/B/C on attend que la zone avec le plus petit numero soit disponible 41 32 42 { 33 43 int rid = -1; … … 35 45 if ((act != MemZA_Fill) && (act != MemZA_Save) && (act != MemZA_Proc)) return rid; 36 46 mex.lock(); 47 uint_8 bestserial = serial_ + 5; 37 48 while ((rid < 0)&&(!stop_)) { 38 switch (act) 39 { 49 switch (act) { 40 50 case MemZA_Fill: 41 51 if (rid < 0) for(uint_4 k=0; k<NbZones(); k++) { 42 52 if ((states[k].act == MemZA_None) && 43 ((states[k].stat == MemZS_Free)||(states[k].stat & MemZS_Saved)) ) 44 { rid = k; break; } 53 ((states[k].stat == MemZS_Free)||(states[k].stat & mask_finalized_)) ) { 54 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; } 55 } 45 56 } 46 57 if (rid >= 0) { states[rid].act = MemZA_Fill; states[rid].stat = MemZS_Free; } … … 48 59 case MemZA_Save: 49 60 for(uint_4 k=0; k<NbZones(); k++) { 50 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) && 51 !(states[k].stat & MemZS_Saved) ) { rid = k; break; } 61 if ((states[k].act == MemZA_None) && 62 (states[k].stat & MemZS_Filled) && !(states[k].stat & MemZS_Saved) ) { 63 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; } 64 } 52 65 } 53 66 if (rid >= 0) states[rid].act = MemZA_Save; … … 55 68 case MemZA_Proc: 56 69 for(uint_4 k=0; k<NbZones(); k++) { 70 if ((states[k].act == MemZA_None) && 71 (states[k].stat & MemZS_Filled) && !(states[k].stat & MemZS_Proc) ) { 72 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; } 73 } 74 } 75 if (rid >= 0) states[rid].act = MemZA_Proc; 76 break; 77 case MemZA_ProcA: 78 for(uint_4 k=0; k<NbZones(); k++) { 57 79 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) && 58 !(states[k].stat & MemZS_Proc) ) { rid = k; break; } 80 !(states[k].stat & MemZS_ProcA) ) { 81 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; } 82 } 59 83 } 60 if (rid >= 0) states[rid].act = MemZA_Proc; 84 if (rid >= 0) states[rid].act = MemZA_ProcA; 85 break; 86 case MemZA_ProcB: 87 for(uint_4 k=0; k<NbZones(); k++) { 88 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) && 89 (states[k].stat & MemZS_ProcA) && !(states[k].stat & MemZS_ProcB) ) { 90 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; } 91 } 92 } 93 if (rid >= 0) states[rid].act = MemZA_ProcB; 94 break; 95 case MemZA_ProcC: 96 for(uint_4 k=0; k<NbZones(); k++) { 97 if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) && 98 (states[k].stat & MemZS_ProcB) && !(states[k].stat & MemZS_ProcC) ) { 99 if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; } 100 } 101 } 102 if (rid >= 0) states[rid].act = MemZA_ProcC; 61 103 break; 62 104 case MemZA_None: // MTQ pour supprimer un warning 63 105 break; 64 } 106 } // Fin de switch 65 107 if (rid < 0) mex.wait(); 66 } 108 } // Fin de while 67 109 mex.unlock(); 68 110 return rid; 69 111 } 70 112 113 /* --Methode-- */ 71 114 int RAcqMemZoneMgr::FreeMemZone(int id, MemZStatus st) 72 115 { … … 75 118 mex.lock(); 76 119 switch (st) { 77 case MemZS_Free : 78 states[id].stat = MemZS_Free; 79 states[id].act = MemZA_None; 80 break; 81 case MemZS_Filled : 82 if (states[id].act != MemZA_Fill) rc = 2; 83 else states[id].nbact[0]++; 84 states[id].stat |= MemZS_Filled; 85 states[id].act = MemZA_None; 86 break; 87 case MemZS_Saved : 88 if (states[id].act != MemZA_Save) rc = 4; 89 else states[id].nbact[1]++; 90 states[id].stat |= MemZS_Saved; 91 states[id].act = MemZA_None; 92 break; 93 case MemZS_Proc : 94 if (states[id].act != MemZA_Proc) rc = 8; 95 else states[id].nbact[2]++; 96 states[id].stat |= MemZS_Proc; 97 states[id].act = MemZA_None; 98 break; 99 default : 100 rc = 16; 101 states[id].stat = MemZS_Free; 102 states[id].act = MemZA_None; 103 break; 104 } 120 case MemZS_Free : 121 states[id].serial = 0; 122 states[id].stat = MemZS_Free; 123 states[id].act = MemZA_None; 124 break; 125 case MemZS_Filled : 126 if (states[id].act != MemZA_Fill) rc = 2; 127 else states[id].nbact[0]++; 128 serial_ ++; 129 states[id].serial = serial_; 130 states[id].stat |= MemZS_Filled; 131 states[id].act = MemZA_None; 132 break; 133 case MemZS_Saved : 134 if (states[id].act != MemZA_Save) rc = 4; 135 else states[id].nbact[1]++; 136 states[id].stat |= MemZS_Saved; 137 states[id].act = MemZA_None; 138 break; 139 case MemZS_Proc : 140 if (states[id].act != MemZA_Proc) rc = 8; 141 else states[id].nbact[2]++; 142 states[id].stat |= MemZS_Proc; 143 states[id].act = MemZA_None; 144 break; 145 case MemZS_ProcA : 146 if (states[id].act != MemZA_ProcA) rc = 16; 147 else states[id].nbact[3]++; 148 states[id].stat |= MemZS_ProcA; 149 states[id].act = MemZA_None; 150 break; 151 case MemZS_ProcB : 152 if (states[id].act != MemZA_ProcB) rc = 32; 153 else states[id].nbact[4]++; 154 states[id].stat |= MemZS_ProcB; 155 states[id].act = MemZA_None; 156 break; 157 case MemZS_ProcC : 158 if (states[id].act != MemZA_ProcC) rc = 64; 159 else states[id].nbact[4]++; 160 states[id].stat |= MemZS_ProcC; 161 states[id].act = MemZA_None; 162 break; 163 default : 164 rc = 128; 165 states[id].serial = 0; 166 states[id].stat = MemZS_Free; 167 states[id].act = MemZA_None; 168 break; 169 } // Fin de switch 105 170 mex.unlock(); 106 171 mex.broadcast(); … … 121 186 for(uint_4 k=0; k<states.size(); k++) 122 187 os << " [" << k << "] Act=" << states[k].act << " Stat=" << states[k].stat 123 << " NbAct[0..2]=" << states[k].nbact[0] << "," << states[k].nbact[1] 124 << "," << states[k].nbact[2] << endl; 188 << " NbAct[0..5]=" << states[k].nbact[0] << "," << states[k].nbact[1] 189 << "," << states[k].nbact[2] << "," << states[k].nbact[3] 190 << "," << states[k].nbact[4] << "," << states[k].nbact[5] << endl; 125 191 return os; 126 192 }
Note:
See TracChangeset
for help on using the changeset viewer.