deferrer: active_safe_wait_promise

This commit is contained in:
2018-12-22 05:17:54 +07:00
parent 6508dc8442
commit d73457cd64
4 changed files with 24 additions and 9 deletions

View File

@@ -91,13 +91,13 @@
- ### `basic high`
- [ ] `library`
- [x] `library`
```
resource management, abstract loaders
groups, dependencies, async loading
```
- [ ] `resources`
- [x] `resources`
```
meshes, shaders, textures, materials
```

View File

@@ -30,6 +30,9 @@ namespace e2d
, typename... Args
, typename R = stdex::jobber::async_invoke_result_t<F, Args...> >
stdex::promise<R> do_in_worker_thread(F&& f, Args&&... args);
template < typename T >
void active_safe_wait_promise(const stdex::promise<T>& promise);
private:
stdex::jobber worker_;
stdex::scheduler scheduler_;
@@ -47,4 +50,16 @@ namespace e2d
stdex::promise<R> deferrer::do_in_worker_thread(F&& f, Args&&... args) {
return worker_.async(std::forward<F>(f), std::forward<Args>(args)...);
}
template < typename T >
void deferrer::active_safe_wait_promise(const stdex::promise<T>& promise) {
const auto zero_us = time::to_chrono(make_microseconds(0));
while ( promise.wait_for(zero_us) == stdex::promise_wait_status::timeout ) {
if ( !is_in_main_thread() || 0 == scheduler_.process_one_task().second ) {
if ( 0 == worker_.active_wait_one().second ) {
std::this_thread::yield();
}
}
}
}
}

View File

@@ -13,6 +13,7 @@ namespace e2d
class asset;
class library;
class starter;
class text_asset;
class mesh_asset;
class image_asset;
@@ -21,6 +22,10 @@ namespace e2d
class texture_asset;
class material_asset;
template < typename Asset, typename Content >
class content_asset;
template < typename T >
class asset_cache;
class asset_cache_base;
}

View File

@@ -21,13 +21,8 @@ namespace e2d
std::shared_ptr<T> library::load_asset(str_view address) {
auto p = load_asset_async<T>(address);
if ( modules::is_initialized<deferrer>() && the<deferrer>().is_in_main_thread() ) {
const auto zero_us = time::to_chrono(make_microseconds(0));
while ( p.wait_for(zero_us) == stdex::promise_wait_status::timeout ) {
if ( 0 == the<deferrer>().scheduler().process_one_task().second ) {
std::this_thread::yield();
}
}
if ( modules::is_initialized<deferrer>() ) {
the<deferrer>().active_safe_wait_promise(p);
}
return p.get_or_default(nullptr);