//------------------------------------------------------------------------------
stPage * stPlainDiskPageManager::GetPage(stPageID pageid){
   stPage * myPage;

   // Do not allow users to load header page from this file.
   if ((pageid != 0) && (pageid <= header->PageCount)){
      
      // Get from cache
      myPage = pageInstanceCache->Get();
      
      // Read data...
      lseek(fd, PageID2Offset(pageid), SEEK_SET);
      read(fd, myPage->GetData(), header->PageSize);
      myPage->SetPageID(pageid);
   
      // Update Counters
      UpdateReadCounter();
      return myPage;
   }else{
      // Error!!!
      #ifdef __stDEBUG__
      throw invalid_argument("Invalid page ID.");
      #else
      return NULL;
      #endif //__stDEBUG__
   }//end if
}//end stPlainDiskPageManager::GetPage
//------------------------------------------------------------------------------
stPage * stDiskPageManager::GetHeaderPage(){
   stPage *hPage = new stPage(this->GetHeaderPageSize());

   myStorage->ReadUserHeader(hPage->GetData());

   // Update Counters
   UpdateReadCounter();

   return hPage;
}//end stDiskPageManager::GetHeaderPage()
stPage * stPlainDiskPageManager::GetHeaderPage(){
   
   // Update read count
   UpdateReadCounter();
   
   // Effective read
   lseek(fd, 0, SEEK_SET);  
   read(fd, (void *)this->headerPage->GetTrueData(), header->PageSize);
    
   return this->headerPage;
}//end stPlainDiskPageManager::GetheaderPage
示例#4
0
static int RawCanWrite(SexyAL_device *device, uint32_t *can_write)
{
    CMI8738_Driver_t *ds = (CMI8738_Driver_t *)device->private_data;

    UpdateReadCounter(ds);

// Handle underflow.
    if(ds->write_counter < ds->read_counter)
        ds->write_counter = ds->read_counter;

    *can_write = (device->buffering.buffer_size - (ds->write_counter - ds->read_counter)) << 2;

    return(1);
}
示例#5
0
static int Clear(SexyAL_device *device)
{
    CMI8738_Driver_t *ds = (CMI8738_Driver_t *)device->private_data;
    const uint32_t base = ds->dmabuf.rm_segment << 4;
    const uint32_t siz = ds->dmabuf.size << 4;

    Pause(device, true);

    _farsetsel(_dos_ds);
    for(unsigned i = 0; i < siz; i += 4)
        _farnspokel(base + i, 0);

    UpdateReadCounter(ds);
    ds->write_counter = ds->read_counter;

    return(1);
}
//------------------------------------------------------------------------------
stPage * stDiskPageManager::GetPage(stPageID pageid){
   stPage * myPage;

   if ((int)pageid <= myStorage->GetTotalPagesIncludingDisposed()){
      // Get from cache
      myPage = pageInstanceCache->Get();
      
      myStorage->ReadPage(pageid-1, myPage->GetData());
      myPage->SetPageID(pageid);
   
      // Update Counters
      UpdateReadCounter();
      return myPage;
   }else{
      // Error!!!
      return NULL;
   }//end if
}//end stDiskPageManager::GetPage()