2626#include < condition_variable>
2727#include < mutex>
2828#include < queue>
29- #include < sstream>
30- #include < thread>
3129
3230#include < async++.h>
3331
3432#include < ghc/filesystem.hpp>
3533
3634#include < absl/container/flat_hash_map.h>
37- #include < absl/time/time.h>
3835
3936#include < geode/basic/identifier.h>
4037#include < geode/basic/pimpl_impl.h>
4138#include < geode/basic/uuid.h>
4239
4340namespace
4441{
45- constexpr auto DATA_EXPIRATION = std::chrono::minutes( 1 );
46- int count{ 0 };
42+ constexpr auto DATA_EXPIRATION = std::chrono::minutes( 3 );
4743} // namespace
4844
4945namespace geode
@@ -52,24 +48,21 @@ namespace geode
5248 {
5349 public:
5450 Storage ( std::unique_ptr< geode::Identifier >&& data )
55- : data_{ std::move ( data ) }, count_{ count++ }
51+ : data_{ std::move ( data ) }
5652 {
57- Logger::debug ( count_, " -> " , " Storage" );
5853 }
5954
6055 ~Storage ()
6156 {
62- Logger::debug ( count_, " -> " , " ~Storage" );
6357 terminate_storage ();
6458 std::unique_lock< std::mutex > locking{ lock_ };
6559 do
6660 {
6761 clean_queue ();
6862 } while ( !condition_.wait_for (
69- locking, std::chrono::microseconds ( 10 ), [this ] {
63+ locking, std::chrono::milliseconds ( 10 ), [this ] {
7064 return queue_.empty ();
7165 } ) );
72- Logger::debug ( count_, " -> " , " ~Storage end" );
7366 }
7467
7568 bool expired () const
@@ -87,9 +80,6 @@ namespace geode
8780 const std::lock_guard< std::mutex > locking{ lock_ };
8881 counter_++;
8982 last_++;
90- std::ostringstream oss;
91- oss << std::this_thread::get_id () << " " << this ;
92- Logger::debug ( count_, " -> " , " new " , counter_, " " );
9383 }
9484
9585 void delete_data_reference ()
@@ -98,25 +88,19 @@ namespace geode
9888 OPENGEODE_ASSERT (
9989 counter_ > 0 , " [Database::Storage] Cannot decrement" );
10090 counter_--;
101- std::ostringstream oss;
102- oss << std::this_thread::get_id () << " " << this ;
103- Logger::debug ( count_, " -> " , " delete " , counter_, " " );
10491 if ( unused () )
10592 {
10693 clean_queue ();
10794 wait_for_memory_release ();
10895 }
10996 }
11097
111- // void set_data( std::unique_ptr< geode::Identifier >&& data )
112- // {
113- // const std::lock_guard< std::mutex > locking{ lock_ };
114- // terminate_ = false;
115- // counter_ = 0;
116- // count_ = count++;
117- // Logger::debug( count_, " -> ", "set_data " );
118- // data_ = std::move( data );
119- // }
98+ void set_data ( std::unique_ptr< geode::Identifier >&& data )
99+ {
100+ const std::lock_guard< std::mutex > locking{ lock_ };
101+ counter_ = 0 ;
102+ data_ = std::move ( data );
103+ }
120104
121105 const std::unique_ptr< geode::Identifier >& data () const
122106 {
@@ -131,13 +115,8 @@ namespace geode
131115 private:
132116 void terminate_storage ()
133117 {
134- std::ostringstream oss;
135- oss << std::this_thread::get_id () << " " << this ;
136- Logger::debug ( count_, " -> " , " begin terminate_storage" );
137118 terminate_ = true ;
138- Logger::debug ( count_, " -> " , " calls " , queue_.size (), " " );
139119 condition_.notify_all ();
140- Logger::debug ( count_, " -> " , " end terminate_storage" );
141120 }
142121
143122 void clean_queue ()
@@ -156,28 +135,17 @@ namespace geode
156135 {
157136 const auto last = last_;
158137 queue_.emplace ( async::spawn ( [this , last] {
159- Logger::debug ( count_, " -> " , " wait start " );
160- Logger::debug ( count_, " -> " , " wait start 2 " );
161138 std::unique_lock< std::mutex > locking{ lock_ };
162- Logger::debug ( count_, " -> " , " wait 2 + " );
163- Logger::debug ( count_, " -> " , " last " , last, " " , last_ );
164139 if ( !condition_.wait_for (
165140 locking, DATA_EXPIRATION, [this , last] {
166- Logger::debug ( count_, " -> " , " terminate " ,
167- terminate_.load (), " " );
168141 return terminate_.load ();
169142 } ) )
170143 {
171- Logger::debug (
172- count_, " -> " , " wait in" , " " , last, " " , last_ );
173144 if ( last == last_ )
174145 {
175- Logger::debug ( count_, " -> " , " wait reset" , " " );
176146 data_.reset ();
177147 }
178148 }
179- Logger::debug (
180- count_, " -> " , " wait out + " , queue_.size (), " " );
181149 locking.unlock ();
182150 condition_.notify_all ();
183151 } ) );
@@ -189,8 +157,7 @@ namespace geode
189157 index_t counter_{ 0 };
190158 std::mutex lock_;
191159 std::condition_variable condition_;
192- index_t last_;
193- int count_;
160+ index_t last_{ 0 };
194161 std::queue< async::task< void > > queue_;
195162 };
196163
@@ -211,11 +178,11 @@ namespace geode
211178 return storage_.size ();
212179 }
213180
214- const uuid& register_unique_data ( std::unique_ptr< Identifier >&& data )
181+ void register_unique_data (
182+ const uuid& id, std::unique_ptr< Identifier >&& data )
215183 {
216- const auto & registered_data = register_data ( std::move ( data ) );
217- save_data ( registered_data );
218- return registered_data->id ();
184+ save_data ( id, data );
185+ register_data ( id, std::move ( data ) );
219186 }
220187
221188 std::shared_ptr< Storage > data ( const uuid& id ) const
@@ -233,14 +200,10 @@ namespace geode
233200 auto & storage = storage_.at ( id );
234201 if ( storage && storage->unused () && !storage->expired () )
235202 {
236- DEBUG ( " in" );
237203 auto * data = storage->steal_data ();
238- DEBUG ( " steal" );
239204 storage.reset ();
240- DEBUG ( " reset" );
241205 return std::unique_ptr< Identifier >{ data };
242206 }
243- DEBUG ( " load" );
244207 return load_data ( id );
245208 }
246209
@@ -258,36 +221,34 @@ namespace geode
258221
259222 private:
260223 const std::unique_ptr< Identifier >& register_data (
261- std::unique_ptr< Identifier >&& data )
224+ const uuid& id, std::unique_ptr< Identifier >&& data )
262225 {
263- const auto & id = data->id ();
264226 const auto it = storage_.find ( id );
265227 if ( it != storage_.end () )
266228 {
267- // if( it->second->unused() )
268- // {
269- // it->second->set_data( std::move( data ) );
270- // return it->second->data();
271- // }
229+ if ( it->second ->unused () )
230+ {
231+ it->second ->set_data ( std::move ( data ) );
232+ return it->second ->data ();
233+ }
272234 delete_data ( id );
273- // return do_register_data( std::move( data ) );
235+ return do_register_data ( id, std::move ( data ) );
274236 }
275- return do_register_data ( std::move ( data ) );
237+ return do_register_data ( id, std::move ( data ) );
276238 }
277239
278240 const std::unique_ptr< Identifier >& do_register_data (
279- std::unique_ptr< Identifier >&& data )
241+ const uuid& id, std::unique_ptr< Identifier >&& data )
280242 {
281- const auto id = data->id ();
282243 auto new_storage = std::make_shared< Storage >( std::move ( data ) );
283244 return storage_.emplace ( id, std::move ( new_storage ) )
284245 .first ->second ->data ();
285246 }
286247
287- void save_data ( const std::unique_ptr< Identifier >& data ) const
248+ void save_data (
249+ const uuid& id, const std::unique_ptr< Identifier >& data ) const
288250 {
289- const auto filename =
290- absl::StrCat ( directory_, " /" , data->id ().string () );
251+ const auto filename = absl::StrCat ( directory_, " /" , id.string () );
291252 std::ofstream file{ filename, std::ofstream::binary };
292253 TContext context;
293254 for ( const auto & serializer : serializers_ )
@@ -378,10 +339,10 @@ namespace geode
378339 return impl_->nb_data ();
379340 }
380341
381- const uuid& Database::register_unique_data (
382- std::unique_ptr< Identifier >&& data )
342+ void Database::register_unique_data (
343+ const uuid& id, std::unique_ptr< Identifier >&& data )
383344 {
384- return impl_->register_unique_data ( std::move ( data ) );
345+ impl_->register_unique_data ( id, std::move ( data ) );
385346 }
386347
387348 Database::Data Database::get_data ( const uuid& id ) const
0 commit comments