Changeset 1711 in Sophya


Ignore:
Timestamp:
Oct 19, 2001, 4:00:40 PM (24 years ago)
Author:
aubourg
Message:

bugs de synchro corriges

Location:
trunk/ArchTOIPipe/Kernel
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/ArchTOIPipe/Kernel/toisegment.cc

    r1710 r1711  
    1010static void cout_lock() {pthread_mutex_lock(&cout_mutex);}
    1111static void cout_unlock() {pthread_mutex_unlock(&cout_mutex);}
    12 //#define LOG(_xxx_)
    13 // /*
     12#define LOG(_xxx_)
     13/*
    1414#define LOG(_xxx_) \
    1515cout_lock(); \
    1616_xxx_; \
    1717cout_unlock();
    18 // */
     18*/
    1919
    2020/******************************/
     
    222222    pthread_mutex_lock(&(master->read_wait_mutex));
    223223    while (sn0<0 || sn >= sn0 + segmentSize*segments.size()) {
    224       wait(); // must be atomic with loop test
     224      wait(); // must be atomic with loop test // $CHECK$ est-ce vrai ?
    225225      pthread_mutex_unlock(&(master->read_wait_mutex));
    226226      LOG(cout << master->name << " BufferView " << hex << this << dec << ": waiting for " << sn << endl)
     
    243243  //pthread_mutex_lock(&(master->read_wait_mutex));
    244244  waiting = true;
     245  master->waitingViews++;
    245246  pthread_cond_wait(&(master->read_wait_condv), &(master->read_wait_mutex));
    246247  waiting = false;
     248  master->waitingViews--;
    247249  //pthread_mutex_unlock(&(master->read_wait_mutex));
    248250}
     
    252254  if (sn > firstNeeded) {
    253255    firstNeeded = sn;
     256    // C'est peut-etre le moment de faire unl sync, si on est coince par ailleurs...
     257    //pthread_mutex_lock(&(master->read_wait_mutex));
     258    if (sn >= sn0 + segmentSize){  //  && master->waitingViews>0) {
     259//       LOG(cout<<master->name<< " sync on wontneed, waitingViews=" << master->waitingViews << endl);
     260       LOG(cout<<master->name<< " sync on wontneed, sn = " << sn << " sn0 = " << sn0 << endl);
     261       sync();
     262    }
     263    //pthread_mutex_unlock(&(master->read_wait_mutex));
    254264  }
    255265}
     
    275285
    276286  waitingOnWrite = false;
     287  waitingViews = 0;
    277288}
    278289
     
    383394  pthread_mutex_lock(&views_mutex);
    384395
    385   int oldBegin = bv->sn0;
    386   int oldEnd   = bv->sn0 + bv->segmentSize * bv->segments.size();
     396//  int oldBegin = bv->sn0;
     397//  int oldEnd   = bv->sn0 + bv->segmentSize * bv->segments.size();
     398  int oldBegin = sn0;
     399  int oldEnd   = sn0 + bv->segmentSize * segments.size();
    387400
    388401  for (vector<BufferSegment*>::iterator i = bv->segments.begin();
     
    402415    for (set<BufferView*>::iterator i = allViews.begin();
    403416         i != allViews.end(); i++) {
     417      LOG(cout << name << " View firstneeded " << (*i)->firstNeeded << endl);
    404418      if ((*i)->firstNeeded < firstNeeded) firstNeeded = (*i)->firstNeeded;
    405419    }
     
    445459  }
    446460
    447   if (bv->sn0 > oldBegin) { // nettoyage de fait, reveiller le writer thread si besoin
     461  if (sn0 > oldBegin) { // nettoyage de fait, reveiller le writer thread si besoin
    448462    signalWrite();
    449463  }
     
    451465  LOG(cout << name << " sync for " << hex << bv << dec << " : "
    452466      << oldBegin << " - " << oldEnd << "  -->  "
    453       << bv->sn0 << " - " << newEnd << endl);
     467      << sn0 << " - " << newEnd << endl);
    454468 
    455469  if (newEnd > oldEnd) { // Nouveautes, reveiller les reader threads si besoin
  • trunk/ArchTOIPipe/Kernel/toisegment.h

    r1710 r1711  
    139139
    140140    bool   waitingOnWrite; // wait on writer thread
     141    int    waitingViews;
    141142
    142143    set<BufferView*>  allViews;
Note: See TracChangeset for help on using the changeset viewer.