Mn, 2024-04-29, 09:09
Diablo: The Hell
Приветствую Вас Новичок | RSS
Главная | BinDiffSynchronizer - Diablo: The Hell - forums | Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Mordor  
Diablo: The Hell - forums » Форум The Hell » The Hell 2 » BinDiffSynchronizer (Работа над важным компонентом TheHell2)
BinDiffSynchronizer
illusion Date: Su, 2010-01-17, 22:19 | Message # 1
Chain Mail
Группа: TH team
Посты: 162
Репутация: 16
Замечания: 0%
Статус: Offline
Олег у меня чёто аська не заработала, так что давай тут обсуждать рабочие моменты.

Добавлено (2010-01-17, 22:19)
---------------------------------------------
Вот всё что я пока наплодил:)
Набросок можно сказать:


Code

#pragma once  

/*
  Ответственность:  
   1. Загрузка и сохранения страниц из некоего хранилища
   2. Предоставление страниц на чтение и запись адресному менеджеру (он кэширует объекты отдельно)
   3. Кэширование страниц
   3. Управление пулом закэшированных страниц
*/
template< unsigned __PageBits = 16, unsigned __PoolSize = 16, unsigned __MaxSize >
class PageDevice
{
public:
  PageDevice()
  {
  };

  virtual ~PageDevice()
  {
  };

protected:
  struct __Page
  {
   unsigned char*    Data[1 << __PageBits];
   unsigned  Page;
   unsigned  Durty;
  }   Pool[__PoolSize];
  unsigned    Map[__MaxSize/(1 << __PageBits)];

  virtual bool  LoadPage( unsigned Page ) = 0;
  virtual bool  SavePage( unsigned Page ) = 0;
};

template< template< unsigned __PageBits, unsigned __PoolSize, unsigned MaxSize > class _PageDevice >
class MemoryDevice
{
  _PageDevice<__PageSize,__PoolSize,__MaxSize>    PageDev;

public:
  bool    ReadMemory( unsigned char* Dst, unsigned char* Src, unsigned Size );
  bool    WriteMemory( unsigned char* Dst, unsigned char* Src, unsigned Size );
};



Edited by illusion - Su, 2010-01-17, 23:26
 
OlProff Date: Su, 2010-01-17, 22:21 | Message # 2
Rags
Группа: TH team
Посты: 2
Репутация: 0
Замечания: 0%
Статус: Offline
ok,сейчас посмотрю
 
illusion Date: Su, 2010-01-17, 22:36 | Message # 3
Chain Mail
Группа: TH team
Посты: 162
Репутация: 16
Замечания: 0%
Статус: Offline
Можно нарисовать примерно следующую архитектуру:
1. Персистный указатель хранящий номер объекта в ПАП
2. Менеджер ПАП состоящий из
2.1 Вектор в ОЗУ кэширующий указатели на закэшированные из ПАП объекты
2.2 Закэшированные структуры менеджера ПАП для быстрого управления памятью в ПАП
2.3 Механизмы создания и удаления персистных объекттов
3. Устройство персистной памяти ( class MemoryDevice )
4. Страничное устройство (class PageDevice), и его конкретные реализации:
4.1 FileDevice
4.2 ArchiveDevice
4.3 CryptoArchiveDevice
4.4 NetworkDevice
 
OlProff Date: Su, 2010-01-17, 23:17 | Message # 4
Rags
Группа: TH team
Посты: 2
Репутация: 0
Замечания: 0%
Статус: Offline
А что ты хочешь , чтобы реализовывал бы адресный менеджер?
 
illusion Date: Mn, 2010-01-18, 00:40 | Message # 5
Chain Mail
Группа: TH team
Посты: 162
Репутация: 16
Замечания: 0%
Статус: Offline
Он должен динамически распределять память под объекты в ПАП, выделять подходящие куски памяти для новых объектов, объединять свододные области при удалении объектов.

Добавлено (2010-01-17, 23:33)
---------------------------------------------
Фактически он должен реализовать функции malloc и free для ПАП, и своих структуры хранить тоже в ПАП.
Его структуры должна начинаться по нулевому адресу ПАП. Первым делом когда мы открываем хранилище мы должны прочитать состояние менеджера ПАП и узнать где какие объекты хранятся в ПАП что бы составить таблицу размещения персистных объектов.

Добавлено (2010-01-17, 23:59)
---------------------------------------------
МОРДОР добавь Олега в TH Team

Добавлено (2010-01-18, 00:17)
---------------------------------------------
Цепочки состояния менеджера ПАП наверно не стоит размазывать по всему ПАП, а кучковать группами например по 1024 объекта.
Каждое звено состояния цепочки менеджера можно сделать примерно следующей структурой:

Code

struct BlockInfo
{
      unsigned ObjectID; // Если = 0 значит область ПАП свободна и является кандидатом на объединение
      unsigned PersistAddress; // Адрес в ПАП
      unsigned ObjectSize; // Размер объекта
      unsigned NextBlobk; // Указатель на следующее звено состояния менеджера в ПАП
};

в принципе BlockInfo тоже является персистным объектом

Добавлено (2010-01-18, 00:28)
---------------------------------------------

Code
// persist template class for primitive c++ types
template <class _T>
class persist
{
      friend class fptr<_T>;
      typedef _T& _Tref;
      typedef _T* _Tptr;
      //union{
   //    _T val;
    unsigned char _data[sizeof(_T)];
      //};
        
      void get_name( char* faddress )
      {
    //strstreambuf buf( faddress, faddress_size );
    //iostream    bufstream( &buf );
    union convert
          {
     persist<_T>* a;
     unsigned     b;
    } c;
    c.a = this;
    //bufstream << "./" << c.b;
    //bufstream.put(0);

    char    str[10];
    _ultoa( c.b, str, 16 );
    strcpy( faddress, ".\\Obj_" );
    strcat( faddress, str );
    strcat( faddress, ".persist" );
      }

public:
      persist()
      {
    char faddress[faddress_size];
    faddress[0] = 0;
    get_name( faddress );
          //memset( (char*)(&_data[0]), 0, sizeof(_T) ); -- уже не нужно
    // вызываем принудительно конструктор
    new((void*)_data) _T;
    ifstream( faddress ).read( (char*)(&_data[0]), sizeof(_T) );
      }
      persist(const _T& ref) : (*(_T*)_data)(ref) {}
      ~persist()
      {
    char faddress[faddress_size];
    get_name( faddress );
    ofstream( faddress ).write( (char*)(&_data[0]), sizeof(_T) );
    // вызываем принудительно деструктор
    ((_T*)_data)->~_T();
      }

      operator _Tref() { return (*(_T*)_data); }
      operator _Tref() const { return (*(_T*)_data); }
      _T* operator&() { return &(*(_T*)_data); }
      _Tref operator=( const _T& ref ) { return (*(_T*)_data) = ref; }
};


Edited by illusion - Mn, 2010-01-18, 00:41
 
Mordor Date: Mn, 2010-01-18, 00:57 | Message # 6
Full Plate
Группа: Alpha Dog
Посты: 4692
Репутация: 84
Статус: Offline
OlProff,
тебя посчитали в команду)
 
illusion Date: We, 2010-01-20, 11:12 | Message # 7
Chain Mail
Группа: TH team
Посты: 162
Репутация: 16
Замечания: 0%
Статус: Offline
Олег я думаю первым тестом персистного хранилища можно сделать Viewer шмоток из TheHell. И на нём отрабатывать архивное хранилище уже. Вьювер несложно сделать.

Добавлено (2010-01-20, 11:12)
---------------------------------------------
Сделал компилирующийся вариант:

Code

///////////////////////////////////////////////////////////////////////////////
//      Cache
///////////////////////////////////////////////////////////////////////////////

template
<
   class _T,
   unsigned CacheSize = 16,
   unsigned SpaceSize = 8
>
class Cache
{
public:
   Cache()
    : Pool(CacheSize), VMap(1 << SpaceSize)
   {
    LastLoadedIndex = -1;
    // Проинициализируем пул
    for( int i = 0; i < CacheSize; i++ )
    {
     Pool[i].Index = -1;
     Pool[i].Durty = false;
    }
   };

   virtual ~Cache()
   {
    // сливаем кэш
   };

   _T*  GetData( unsigned Index, bool ForWrite )
   {
    if( VMap[Index] != NULL )
    {
     VMap[Index]->Durty |= ForWrite;
     return &VMap[Index]->Obj;
    }
    else
    {
     // найдём место для загрузки
     unsigned PoolPos = (LastLoadedIndex + 1) % CacheSize;

     if( Pool[PoolPos].Index >= 0 )
     {
      if( Pool[PoolPos].Durty )
      {
       if( !Save( Pool[PoolPos].Index, Pool[PoolPos].Obj ) )
       {
        // ошибка сохранения страницы
        return NULL;
       }
       Pool[PoolPos].Durty = false;
      }
      VMap[Pool[PoolPos].Index] = NULL;
     }

     Pool[PoolPos].Index = Index;

     if( Load( Index, Pool[PoolPos].Obj ) )
     {    //    если загрузили страницу
      LastLoadedIndex = PoolPos;
      VMap[Index] = &Pool[PoolPos];
      VMap[Index]->Durty = ForWrite;
      return &Pool[PoolPos].Obj;
     }
     else
     {
      return NULL;
     }
    }
   };

protected:
   virtual bool  Load( unsigned Index, _T& Ref ) = 0;
   virtual bool  Save( unsigned Index, _T& Ref ) = 0;

private:
   template< class __T >
   struct Container
   {
    __T  Obj;
    int  Index;
    bool Durty;
   };
   vector<Container<_T>>  Pool;
   vector<Container<_T>*> VMap;
   int                LastLoadedIndex;
};

///////////////////////////////////////////////////////////////////////////////
//      PageDevice
///////////////////////////////////////////////////////////////////////////////

template < unsigned PageSize = 16 >
class Page
{
public:
   unsigned char Data[1 << PageSize];
};

template
<   
   unsigned PageSize = 16,   
   unsigned PoolSize = 16,
   unsigned SpaceSize = 8,
   template< class, unsigned, unsigned > class CachePolicy
>
class PageDevice : public CachePolicy< Page<PageSize>, PoolSize, SpaceSize >
{
public:
   static const unsigned __PageCount = 1 << SpaceSize;

   PageDevice()
   {
   };

   virtual ~PageDevice()
   {
   };

protected:
   virtual bool  Load( unsigned Index, Page<PageSize>& Ref ){ return false; };
   virtual bool  Save( unsigned Index, Page<PageSize>& Ref ){ return false; };
};


Edited by illusion - We, 2010-01-20, 15:57
 
Diablo: The Hell - forums » Форум The Hell » The Hell 2 » BinDiffSynchronizer (Работа над важным компонентом TheHell2)
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2024 Хостинг от uCoz