mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-13 15:48:11 +07:00
deferrer: active_safe_wait_promise
This commit is contained in:
@@ -91,13 +91,13 @@
|
||||
|
||||
- ### `basic high`
|
||||
|
||||
- [ ] `library`
|
||||
- [x] `library`
|
||||
```
|
||||
resource management, abstract loaders
|
||||
groups, dependencies, async loading
|
||||
```
|
||||
|
||||
- [ ] `resources`
|
||||
- [x] `resources`
|
||||
```
|
||||
meshes, shaders, textures, materials
|
||||
```
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user