Demos: app/persistence_test.cc Para um objeto ser persistente, ele precisa extender a classe PersistentObject e declarar os atributos que ele deseja que sejam persistentes. class Carro : public PersistentObject { public: Persistent cor; Persistent nRodas; Persistent velocidade; public: Carro(char cor, long long int nRodas, int velocidade) : cor(cor), nRodas(nRodas), velocidade(velocidade) {}; }; Para construir um objeto persistente, basta chamar seu construtor, passando seu id como parâmetro para o operador new, implementado em include/persistent_impl.h. Para facilitar para o usuário, existe uma macro (PERSISTENT_OBJECT_ID) que gera um id automaticamente, sendo cada id no programa único, dependente do arquivo, linha e número de sequência, que diferencia objetos criados na mesma linha dentro de um loop, por exemplo. Se esse objeto não existir na memória, ele é criado com os parâmetros do construtor, senão, ele é carregado da memória. Carro * c1 = new(PERSISTENT_OBJECT_ID) Carro('a', 5, 15); Um problema é que se a criação do objeto dentro de um loop depender de uma condição, ele pode ser chamado algumas vezes e outras não, e não tem como saber qual o objeto que deve ser carregado. Todos os operadores de atribuição foram sobreescritos na classe Persistent. Desta forma, quando algum atributo persistente mudar de valor, a memória será atualizada através do método save do PersistenceManager, que tem como parâmetros o id do objeto, um sub-id pertencente ao atributo, gerado automaticamente e uma referência do valor a ser salvo. c1->nRodas += 2; Para que a utilização seja o mais transparente possível, foi implementado um cast da classe Persistent para Type, assim, um inteiro persistente, por exemplo, pode ser usado como um inteiro normal. O método setMemory do PersistenceManager cria uma nova ObjectsTable, fazendo com que os objetos sejam apagados e tenham que ser carregados novamente da memória. Como a memória implementada se baseia num array, isso permite que o programa seja testado numa única execução, evitando que se tenha que copiar o valor do array para a próxima execução. PersistenceManager::instance()->setMemory(memory); app/persistent_semaphore_test.cc Implementamos um semáforo persistente, transformando o atributo _value em persistente. No teste, como a ObjectsTable é zerada com o método setMemory, o semáforo é recarregado da memória. Como ele é inicializado com 2 na primeira vez que o new é chamado, o programa trava quando é dado o terceiro p(). Memória: A memória é organizada da seguinte maneira: Um inteiro represantando o número de objetos na memória. Um índice de objetos, composto por id's e endereços em que os objetos estão localizados. Os objetos, compostos de: número de atributos e tamanho e valor de cada atributo. Quando é chamado o método setMemory, é carregado o índice. Quando é criado um objeto persistente, seus atributos são carregados ou ele é salvo na memória, caso ainda não exista. O gerenciamento dos objetos carregados e o salvamento são feitos pelo ObjectsTable, que é responsável por mantê-los na memória volátil(RAM) para rápido acesso.