Dynalib Utils
DynaBufferCacheImpl.h
Go to the documentation of this file.
1 //
2 // Created by Ken Kopelson on 26/04/18.
3 //
4 #ifndef DYNABUFFERCACHEIMPL_H
5 #define DYNABUFFERCACHEIMPL_H
6 
7 #include "DynaBufferCache.h"
8 #include "DynaCache.h"
10 
11 #define MAKE_BUFFERCACHETYPE_INSTANCE(C, T) \
12  template class DynaBufferCache<C>; \
13  typedef DynaBufferCache<C> T##BufferCache
14 
15 template<class T>
17  _file = file;
18 }
19 
20 template<class T>
22  DynaCache<T>::setListener(listener);
23 }
24 
25 template<class T>
27  DynaBuffer* buffer = page->getBuffer();
28  if (buffer != nullptr) {
29  if (DynaCache<T>::_listener != nullptr)
30  DynaCache<T>::_listener->onFlush(page);
31  if (buffer->isDirty()) {
32  _file->writePage(page->getPageIndex(), buffer);
33  buffer->setIsDirty(false);
35  }
36  if (DynaCache<T>::_listener != nullptr) {
38  }
39  }
40 }
41 
42 template<class T>
44  flushPage(page);
45  DynaBuffer* buffer = page->getBuffer();
46  if (buffer != nullptr)
47  buffer->invalidate();
48 }
49 
50 template<class T>
52  T* page = entry->getObject();
53  flushAndInvalidate(page);
54  return page;
55 }
56 
57 template<class T>
59  LinkedEntry<T>* entry = DynaCache<T>::_pageList->getLast();
60  if (entry != nullptr) {
61  T* page = getPageForRemoval(entry);
62  DynaCache<T>::_pageMap->remove(page->getKeyValue());
63  page->clear();
64  page->setKeyValue(keyValue);
65  page->setBuffer(buffer);
66  DynaCache<T>::_pageMap->put(keyValue, entry);
69  }
70  return entry;
71 }
72 
73 template<class T>
76  if (entry == nullptr) {
78  entry = useLastPage(keyValue, buffer);
79  if (entry == nullptr) {
80  T* page = DynaCache<T>::getNewPage();
81  page->setKeyValue(keyValue);
82  page->setBuffer(buffer);
83  entry = DynaCache<T>::addNewPage(page);
84  }
85  }
86  else
88  return entry;
89 }
90 
91 template<class T>
93  LinkedEntry<T>* entry = putPageEntry(keyValue, buffer);
94  return entry != nullptr ? entry->getObject() : nullptr;
95 }
96 
97 #endif
T * getObject() const
Definition: DynaLinkedListImpl.h:58
T * getPageForRemoval(LinkedEntry< T > *entry) override
Definition: DynaBufferCacheImpl.h:51
void invalidate()
Definition: DynaBuffer.cpp:324
Definition: IDynaCacheListener.h:11
void touchEntry(LinkedEntry< T > *entry)
Definition: DynaCacheImpl.h:153
Definition: DynaLinkedList.h:32
Definition: DynaCache.h:16
virtual void setListener(IDynaCacheListener< T > *listener)
Definition: DynaCacheImpl.h:133
void setListener(IDynaCacheListener< T > *listener) override
Definition: DynaBufferCacheImpl.h:21
void setIsDirty(bool isDirty)
Definition: DynaBuffer.cpp:72
LinkedEntry< T > * findPageEntry(Index keyValue)
Definition: DynaCacheImpl.h:252
Definition: IntWrapper.h:13
void flushAndInvalidate(T *page)
Definition: DynaBufferCacheImpl.h:43
void clear()
Definition: DynaCacheImpl.h:69
Definition: IDynaBufferCacheListener.h:12
DynaBufferCache(PageFile *file)
Definition: DynaBufferCacheImpl.h:16
LinkedEntry< T > * addNewPage(T *page)
Definition: DynaCacheImpl.h:171
T * getNewPage()
Definition: DynaCacheImpl.h:161
T * putPage(Index keyValue, DynaBuffer *buffer)
Definition: DynaBufferCacheImpl.h:92
bool isDirty()
Definition: DynaBuffer.cpp:68
void flushPage(T *page) override
Definition: DynaBufferCacheImpl.h:26
LinkedEntry< T > * useLastPage(Index keyValue, DynaBuffer *buffer)
Definition: DynaBufferCacheImpl.h:58
void writePage(index_t pageIndex, DynaBuffer *buffer, int bufOffset, size_t length)
writes a portion of the passed in buffer to the corresponding location in the page on disk...
Definition: PageFile.cpp:367
Definition: PageFile.h:36
Definition: DynaBuffer.h:20
LinkedEntry< T > * putPageEntry(Index keyValue, DynaBuffer *buffer)
Definition: DynaBufferCacheImpl.h:74