Scroom  0.14
memoryblobs.hh
Go to the documentation of this file.
1 /*
2  * Scroom - Generic viewer for 2D data
3  * Copyright (C) 2009-2022 Kees-Jan Dijkzeul
4  *
5  * SPDX-License-Identifier: LGPL-2.1
6  */
7 
8 #pragma once
9 
10 #include <cstdint>
11 #include <list>
12 #include <utility>
13 
14 #include <boost/shared_ptr.hpp>
15 #include <boost/thread.hpp>
16 #include <boost/weak_ptr.hpp>
17 
18 #include <scroom/blockallocator.hh>
19 #include <scroom/utilities.hh>
20 
21 class ThreadPool;
22 
24 {
25  namespace RawPageData
26  {
27  using Ptr = boost::shared_ptr<uint8_t>;
28  using ConstPtr = boost::shared_ptr<const uint8_t>;
29  using WeakPtr = boost::weak_ptr<uint8_t>;
30  } // namespace RawPageData
31 
32  namespace Page
33  {
34  using Ptr = boost::shared_ptr<Scroom::MemoryBlocks::Page>;
35  }
36  using PageList = std::list<Page::Ptr>;
37 
38  class PageProvider : virtual public Scroom::Utils::Base
39  {
40  public:
41  using Ptr = boost::shared_ptr<PageProvider>;
42 
43  private:
44  size_t blockCount;
45  size_t blockSize;
48  std::list<Scroom::MemoryBlocks::Page*> freePages;
49  boost::mutex mut;
50 
51  private:
53  {
54  private:
56 
57  public:
60  };
61 
62  friend class MarkPageFree;
63 
64  private:
65  PageProvider(size_t blockCount, size_t blockSize);
66 
68 
69  public:
70  static Ptr create(size_t blockCount, size_t blockSize);
72  size_t getPageSize() const;
73  };
74 
75  class Blob : virtual public Scroom::Utils::Base
76  {
77  public:
78  using Ptr = boost::shared_ptr<Blob>;
79 
80  private:
81  enum State
82  {
87  };
88 
89  class UnloadData
90  {
91  private:
93 
94  public:
95  explicit UnloadData(Blob::Ptr blob);
96  void operator()(uint8_t* data);
97  };
98 
99  friend class UnloadData;
100 
101  private:
103  size_t size;
104  uint8_t* data{nullptr};
106  boost::mutex mut;
109  boost::shared_ptr<ThreadPool> cpuBound;
110  int refcount{0}; // Yuk
111 
112  private:
114  void unload();
116  void compress();
117 
118  public:
119  static Ptr create(PageProvider::Ptr provider, size_t size);
122  RawPageData::Ptr initialize(uint8_t value);
123  };
124 
126  // Implementation
127 
129  : provider(std::move(provider_))
130  {
131  }
132 
133  inline void PageProvider::MarkPageFree::operator()(Scroom::MemoryBlocks::Page* p) { provider->markPageFree(p); }
134 
136 
138  : blob(std::move(blob_))
139  {
140  }
141 
142  inline void Blob::UnloadData::operator()(uint8_t* /*unused*/)
143  {
144  blob->unload();
145  blob.reset();
146  }
147 } // namespace Scroom::MemoryBlobs
Scroom::MemoryBlobs::PageProvider::PageProvider
PageProvider(size_t blockCount, size_t blockSize)
Definition: memoryblobs.cc:30
Scroom::MemoryBlobs::PageProvider::Ptr
boost::shared_ptr< PageProvider > Ptr
Definition: memoryblobs.hh:41
Scroom::MemoryBlobs::PageProvider::freePages
std::list< Scroom::MemoryBlocks::Page * > freePages
Definition: memoryblobs.hh:48
Scroom::MemoryBlobs::RawPageData::ConstPtr
boost::shared_ptr< const uint8_t > ConstPtr
Definition: memoryblobs.hh:28
Scroom::MemoryBlocks::Page
Definition: blockallocator.hh:29
Scroom::MemoryBlobs::Blob::UnloadData::blob
Blob::Ptr blob
Definition: memoryblobs.hh:92
Scroom::MemoryBlobs::Blob::UnloadData
Definition: memoryblobs.hh:89
Scroom::MemoryBlobs::PageProvider::allPages
Scroom::MemoryBlocks::PageList allPages
Definition: memoryblobs.hh:47
Scroom::MemoryBlobs::Blob::Ptr
boost::shared_ptr< Blob > Ptr
Definition: memoryblobs.hh:78
Scroom::MemoryBlobs::Blob::refcount
int refcount
Definition: memoryblobs.hh:110
Scroom::MemoryBlobs::Blob::initialize
RawPageData::Ptr initialize(uint8_t value)
Definition: memoryblobs.cc:159
Scroom::MemoryBlobs::Blob::provider
PageProvider::Ptr provider
Definition: memoryblobs.hh:102
Scroom::MemoryBlobs::Blob::State
State
Definition: memoryblobs.hh:81
Scroom::MemoryBlobs::PageProvider::MarkPageFree
Definition: memoryblobs.hh:52
ThreadPool
Definition: threadpool.hh:46
Scroom::MemoryBlobs::Blob::weakData
RawPageData::WeakPtr weakData
Definition: memoryblobs.hh:107
Scroom::MemoryBlobs::PageList
std::list< Page::Ptr > PageList
Definition: memoryblobs.hh:36
utilities.hh
blockallocator.hh
Scroom::MemoryBlobs::Blob::UNINITIALIZED
@ UNINITIALIZED
Definition: memoryblobs.hh:83
Scroom::MemoryBlobs::Blob::load
RawPageData::Ptr load()
Definition: memoryblobs.cc:81
Scroom::MemoryBlobs::PageProvider::create
static Ptr create(size_t blockCount, size_t blockSize)
Definition: memoryblobs.cc:37
Scroom::MemoryBlobs::PageProvider
Definition: memoryblobs.hh:38
Scroom::MemoryBlobs::PageProvider::getPageSize
size_t getPageSize() const
Definition: memoryblobs.cc:61
Scroom::MemoryBlobs::PageProvider::mut
boost::mutex mut
Definition: memoryblobs.hh:49
Scroom::MemoryBlobs::Blob::size
size_t size
Definition: memoryblobs.hh:103
Scroom::MemoryBlocks::PageList
std::list< Page > PageList
Definition: blockallocator.hh:41
Scroom::MemoryBlobs::RawPageData::Ptr
boost::shared_ptr< uint8_t > Ptr
Definition: memoryblobs.hh:27
Scroom::MemoryBlobs::Page::Ptr
boost::shared_ptr< Scroom::MemoryBlocks::Page > Ptr
Definition: memoryblobs.hh:34
Scroom::MemoryBlobs::Blob::UnloadData::operator()
void operator()(uint8_t *data)
Definition: memoryblobs.hh:142
Scroom::MemoryBlobs::Blob::mut
boost::mutex mut
Definition: memoryblobs.hh:106
Scroom::MemoryBlobs::Blob::CLEAN
@ CLEAN
Definition: memoryblobs.hh:84
Scroom::MemoryBlobs::Blob::COMPRESSING
@ COMPRESSING
Definition: memoryblobs.hh:86
Scroom::Utils::Base
Definition: utilities.hh:30
Scroom::MemoryBlobs::Blob::compress
void compress()
Definition: memoryblobs.cc:136
Scroom::MemoryBlobs::Blob::UnloadData::UnloadData
UnloadData(Blob::Ptr blob)
Definition: memoryblobs.hh:137
Scroom::MemoryBlobs::PageProvider::blockSize
size_t blockSize
Definition: memoryblobs.hh:45
Scroom::MemoryBlobs::Blob::getConst
RawPageData::ConstPtr getConst()
Definition: memoryblobs.cc:168
Scroom::MemoryBlobs
Definition: memoryblobs.hh:23
Scroom::MemoryBlobs::PageProvider::blockFactoryInterface
Scroom::MemoryBlocks::BlockFactoryInterface::Ptr blockFactoryInterface
Definition: memoryblobs.hh:46
Scroom::MemoryBlobs::Blob::create
static Ptr create(PageProvider::Ptr provider, size_t size)
Definition: memoryblobs.cc:71
Scroom::MemoryBlobs::PageProvider::markPageFree
void markPageFree(Scroom::MemoryBlocks::Page *page)
Definition: memoryblobs.cc:63
Scroom::MemoryBlobs::RawPageData::WeakPtr
boost::weak_ptr< uint8_t > WeakPtr
Definition: memoryblobs.hh:29
Scroom::MemoryBlobs::PageProvider::MarkPageFree::provider
PageProvider::Ptr provider
Definition: memoryblobs.hh:55
Scroom::MemoryBlobs::PageProvider::blockCount
size_t blockCount
Definition: memoryblobs.hh:44
Scroom::MemoryBlobs::PageProvider::MarkPageFree::operator()
void operator()(Scroom::MemoryBlocks::Page *page)
Definition: memoryblobs.hh:133
Scroom::MemoryBlobs::PageProvider::MarkPageFree::MarkPageFree
MarkPageFree(PageProvider::Ptr provider)
Definition: memoryblobs.hh:128
Scroom::MemoryBlobs::Blob
Definition: memoryblobs.hh:75
Scroom::MemoryBlocks::BlockFactoryInterface::Ptr
boost::shared_ptr< BlockFactoryInterface > Ptr
Definition: blockallocator.hh:61
Scroom::MemoryBlobs::Blob::data
uint8_t * data
Definition: memoryblobs.hh:104
Scroom::MemoryBlobs::Blob::DIRTY
@ DIRTY
Definition: memoryblobs.hh:85
Scroom::MemoryBlobs::Blob::pages
PageList pages
Definition: memoryblobs.hh:108
Scroom::MemoryBlobs::Blob::unload
void unload()
Definition: memoryblobs.cc:117
Scroom::MemoryBlobs::Blob::Blob
Blob(PageProvider::Ptr provider, size_t size)
Definition: memoryblobs.cc:73
Scroom::MemoryBlobs::PageProvider::getFreePage
Page::Ptr getFreePage()
Definition: memoryblobs.cc:42
Scroom::MemoryBlobs::Blob::get
RawPageData::Ptr get()
Definition: memoryblobs.cc:151
Scroom::MemoryBlobs::Blob::state
State state
Definition: memoryblobs.hh:105
Scroom::MemoryBlobs::Blob::cpuBound
boost::shared_ptr< ThreadPool > cpuBound
Definition: memoryblobs.hh:109