Changeset 3626 in Sophya for trunk/AddOn/TAcq/racqumem.cc


Ignore:
Timestamp:
May 22, 2009, 6:18:06 PM (16 years ago)
Author:
ansari
Message:

Introduction numero d'ordre de remplissage, mask de recyclage,
et sequence de traitement procA/B/C dans le gestionnaire de
memoire - Reza 22/05/2009

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/AddOn/TAcq/racqumem.cc

    r3623 r3626  
    66//----------------------------------------------------------------
    77
    8 
     8/* --Methode-- */
    99RAcqMemZoneMgr::RAcqMemZoneMgr(uint_4 nz, uint_4 np, uint_4 psz)
    1010  : mex(true), nzones(nz), npaq(np), paqsz(psz), stop_(false)
     
    1212  St_MemZ st;
    1313
     14  st.serial = 0;
    1415  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;
    1718  uint_8 mzsz = npaq*paqsz;
    1819
     
    2122     states.push_back(st);
    2223   }
    23  
     24  serial_ = 0;
     25  SetFinalizedMask();
    2426}
    2527
     28/* --Methode-- */
    2629RAcqMemZoneMgr::~RAcqMemZoneMgr()
    2730{
     
    2932}
    3033
     34/* --Methode-- */
    3135int 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
    3242{
    3343  int rid = -1;
     
    3545  if ((act != MemZA_Fill) && (act != MemZA_Save) && (act != MemZA_Proc)) return rid;
    3646  mex.lock();
     47  uint_8 bestserial = serial_ + 5;
    3748  while ((rid < 0)&&(!stop_)) {
    38     switch (act)
    39       {
     49    switch (act)  {
    4050      case MemZA_Fill:
    4151        if (rid < 0) for(uint_4 k=0; k<NbZones(); k++) {
    4252          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          }
    4556        }
    4657        if (rid >= 0) { states[rid].act = MemZA_Fill; states[rid].stat = MemZS_Free; }
     
    4859      case MemZA_Save:
    4960        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          }
    5265        }
    5366        if (rid >= 0) states[rid].act = MemZA_Save;
     
    5568      case MemZA_Proc:
    5669        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++) {
    5779          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          }
    5983        }
    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;             
    61103        break;
    62104      case MemZA_None:   // MTQ pour supprimer un warning
    63105        break;
    64       }
     106      }  // Fin de switch
    65107    if (rid < 0)  mex.wait();
    66   }
     108  }  // Fin de while
    67109  mex.unlock();
    68110  return rid;
    69111}
    70112
     113/* --Methode-- */
    71114int RAcqMemZoneMgr::FreeMemZone(int id, MemZStatus st)
    72115{
     
    75118  mex.lock();
    76119  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
    105170  mex.unlock();
    106171  mex.broadcast();
     
    121186  for(uint_4 k=0; k<states.size(); k++)
    122187    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;       
    125191  return os;   
    126192}
Note: See TracChangeset for help on using the changeset viewer.