26
26
#include < condition_variable>
27
27
#include < mutex>
28
28
#include < queue>
29
- #include < sstream>
30
- #include < thread>
31
29
32
30
#include < async++.h>
33
31
34
32
#include < ghc/filesystem.hpp>
35
33
36
34
#include < absl/container/flat_hash_map.h>
37
- #include < absl/time/time.h>
38
35
39
36
#include < geode/basic/identifier.h>
40
37
#include < geode/basic/pimpl_impl.h>
41
38
#include < geode/basic/uuid.h>
42
39
43
40
namespace
44
41
{
45
- constexpr auto DATA_EXPIRATION = std::chrono::minutes( 1 );
46
- int count{ 0 };
42
+ constexpr auto DATA_EXPIRATION = std::chrono::minutes( 3 );
47
43
} // namespace
48
44
49
45
namespace geode
@@ -52,24 +48,21 @@ namespace geode
52
48
{
53
49
public:
54
50
Storage ( std::unique_ptr< geode::Identifier >&& data )
55
- : data_{ std::move ( data ) }, count_{ count++ }
51
+ : data_{ std::move ( data ) }
56
52
{
57
- Logger::debug ( count_, " -> " , " Storage" );
58
53
}
59
54
60
55
~Storage ()
61
56
{
62
- Logger::debug ( count_, " -> " , " ~Storage" );
63
57
terminate_storage ();
64
58
std::unique_lock< std::mutex > locking{ lock_ };
65
59
do
66
60
{
67
61
clean_queue ();
68
62
} while ( !condition_.wait_for (
69
- locking, std::chrono::microseconds ( 10 ), [this ] {
63
+ locking, std::chrono::milliseconds ( 10 ), [this ] {
70
64
return queue_.empty ();
71
65
} ) );
72
- Logger::debug ( count_, " -> " , " ~Storage end" );
73
66
}
74
67
75
68
bool expired () const
@@ -87,9 +80,6 @@ namespace geode
87
80
const std::lock_guard< std::mutex > locking{ lock_ };
88
81
counter_++;
89
82
last_++;
90
- std::ostringstream oss;
91
- oss << std::this_thread::get_id () << " " << this ;
92
- Logger::debug ( count_, " -> " , " new " , counter_, " " );
93
83
}
94
84
95
85
void delete_data_reference ()
@@ -98,25 +88,19 @@ namespace geode
98
88
OPENGEODE_ASSERT (
99
89
counter_ > 0 , " [Database::Storage] Cannot decrement" );
100
90
counter_--;
101
- std::ostringstream oss;
102
- oss << std::this_thread::get_id () << " " << this ;
103
- Logger::debug ( count_, " -> " , " delete " , counter_, " " );
104
91
if ( unused () )
105
92
{
106
93
clean_queue ();
107
94
wait_for_memory_release ();
108
95
}
109
96
}
110
97
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
+ }
120
104
121
105
const std::unique_ptr< geode::Identifier >& data () const
122
106
{
@@ -131,13 +115,8 @@ namespace geode
131
115
private:
132
116
void terminate_storage ()
133
117
{
134
- std::ostringstream oss;
135
- oss << std::this_thread::get_id () << " " << this ;
136
- Logger::debug ( count_, " -> " , " begin terminate_storage" );
137
118
terminate_ = true ;
138
- Logger::debug ( count_, " -> " , " calls " , queue_.size (), " " );
139
119
condition_.notify_all ();
140
- Logger::debug ( count_, " -> " , " end terminate_storage" );
141
120
}
142
121
143
122
void clean_queue ()
@@ -156,28 +135,17 @@ namespace geode
156
135
{
157
136
const auto last = last_;
158
137
queue_.emplace ( async::spawn ( [this , last] {
159
- Logger::debug ( count_, " -> " , " wait start " );
160
- Logger::debug ( count_, " -> " , " wait start 2 " );
161
138
std::unique_lock< std::mutex > locking{ lock_ };
162
- Logger::debug ( count_, " -> " , " wait 2 + " );
163
- Logger::debug ( count_, " -> " , " last " , last, " " , last_ );
164
139
if ( !condition_.wait_for (
165
140
locking, DATA_EXPIRATION, [this , last] {
166
- Logger::debug ( count_, " -> " , " terminate " ,
167
- terminate_.load (), " " );
168
141
return terminate_.load ();
169
142
} ) )
170
143
{
171
- Logger::debug (
172
- count_, " -> " , " wait in" , " " , last, " " , last_ );
173
144
if ( last == last_ )
174
145
{
175
- Logger::debug ( count_, " -> " , " wait reset" , " " );
176
146
data_.reset ();
177
147
}
178
148
}
179
- Logger::debug (
180
- count_, " -> " , " wait out + " , queue_.size (), " " );
181
149
locking.unlock ();
182
150
condition_.notify_all ();
183
151
} ) );
@@ -189,8 +157,7 @@ namespace geode
189
157
index_t counter_{ 0 };
190
158
std::mutex lock_;
191
159
std::condition_variable condition_;
192
- index_t last_;
193
- int count_;
160
+ index_t last_{ 0 };
194
161
std::queue< async::task< void > > queue_;
195
162
};
196
163
@@ -211,11 +178,11 @@ namespace geode
211
178
return storage_.size ();
212
179
}
213
180
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 )
215
183
{
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 ) );
219
186
}
220
187
221
188
std::shared_ptr< Storage > data ( const uuid& id ) const
@@ -233,14 +200,10 @@ namespace geode
233
200
auto & storage = storage_.at ( id );
234
201
if ( storage && storage->unused () && !storage->expired () )
235
202
{
236
- DEBUG ( " in" );
237
203
auto * data = storage->steal_data ();
238
- DEBUG ( " steal" );
239
204
storage.reset ();
240
- DEBUG ( " reset" );
241
205
return std::unique_ptr< Identifier >{ data };
242
206
}
243
- DEBUG ( " load" );
244
207
return load_data ( id );
245
208
}
246
209
@@ -258,36 +221,34 @@ namespace geode
258
221
259
222
private:
260
223
const std::unique_ptr< Identifier >& register_data (
261
- std::unique_ptr< Identifier >&& data )
224
+ const uuid& id, std::unique_ptr< Identifier >&& data )
262
225
{
263
- const auto & id = data->id ();
264
226
const auto it = storage_.find ( id );
265
227
if ( it != storage_.end () )
266
228
{
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
+ }
272
234
delete_data ( id );
273
- // return do_register_data( std::move( data ) );
235
+ return do_register_data ( id, std::move ( data ) );
274
236
}
275
- return do_register_data ( std::move ( data ) );
237
+ return do_register_data ( id, std::move ( data ) );
276
238
}
277
239
278
240
const std::unique_ptr< Identifier >& do_register_data (
279
- std::unique_ptr< Identifier >&& data )
241
+ const uuid& id, std::unique_ptr< Identifier >&& data )
280
242
{
281
- const auto id = data->id ();
282
243
auto new_storage = std::make_shared< Storage >( std::move ( data ) );
283
244
return storage_.emplace ( id, std::move ( new_storage ) )
284
245
.first ->second ->data ();
285
246
}
286
247
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
288
250
{
289
- const auto filename =
290
- absl::StrCat ( directory_, " /" , data->id ().string () );
251
+ const auto filename = absl::StrCat ( directory_, " /" , id.string () );
291
252
std::ofstream file{ filename, std::ofstream::binary };
292
253
TContext context;
293
254
for ( const auto & serializer : serializers_ )
@@ -378,10 +339,10 @@ namespace geode
378
339
return impl_->nb_data ();
379
340
}
380
341
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 )
383
344
{
384
- return impl_->register_unique_data ( std::move ( data ) );
345
+ impl_->register_unique_data ( id, std::move ( data ) );
385
346
}
386
347
387
348
Database::Data Database::get_data ( const uuid& id ) const
0 commit comments