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`
|
- ### `basic high`
|
||||||
|
|
||||||
- [ ] `library`
|
- [x] `library`
|
||||||
```
|
```
|
||||||
resource management, abstract loaders
|
resource management, abstract loaders
|
||||||
groups, dependencies, async loading
|
groups, dependencies, async loading
|
||||||
```
|
```
|
||||||
|
|
||||||
- [ ] `resources`
|
- [x] `resources`
|
||||||
```
|
```
|
||||||
meshes, shaders, textures, materials
|
meshes, shaders, textures, materials
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -30,6 +30,9 @@ namespace e2d
|
|||||||
, typename... Args
|
, typename... Args
|
||||||
, typename R = stdex::jobber::async_invoke_result_t<F, Args...> >
|
, typename R = stdex::jobber::async_invoke_result_t<F, Args...> >
|
||||||
stdex::promise<R> do_in_worker_thread(F&& f, Args&&... 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:
|
private:
|
||||||
stdex::jobber worker_;
|
stdex::jobber worker_;
|
||||||
stdex::scheduler scheduler_;
|
stdex::scheduler scheduler_;
|
||||||
@@ -47,4 +50,16 @@ namespace e2d
|
|||||||
stdex::promise<R> deferrer::do_in_worker_thread(F&& f, Args&&... args) {
|
stdex::promise<R> deferrer::do_in_worker_thread(F&& f, Args&&... args) {
|
||||||
return worker_.async(std::forward<F>(f), std::forward<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 asset;
|
||||||
class library;
|
class library;
|
||||||
class starter;
|
class starter;
|
||||||
|
|
||||||
class text_asset;
|
class text_asset;
|
||||||
class mesh_asset;
|
class mesh_asset;
|
||||||
class image_asset;
|
class image_asset;
|
||||||
@@ -21,6 +22,10 @@ namespace e2d
|
|||||||
class texture_asset;
|
class texture_asset;
|
||||||
class material_asset;
|
class material_asset;
|
||||||
|
|
||||||
|
template < typename Asset, typename Content >
|
||||||
|
class content_asset;
|
||||||
|
|
||||||
template < typename T >
|
template < typename T >
|
||||||
class asset_cache;
|
class asset_cache;
|
||||||
|
class asset_cache_base;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,13 +21,8 @@ namespace e2d
|
|||||||
std::shared_ptr<T> library::load_asset(str_view address) {
|
std::shared_ptr<T> library::load_asset(str_view address) {
|
||||||
auto p = load_asset_async<T>(address);
|
auto p = load_asset_async<T>(address);
|
||||||
|
|
||||||
if ( modules::is_initialized<deferrer>() && the<deferrer>().is_in_main_thread() ) {
|
if ( modules::is_initialized<deferrer>() ) {
|
||||||
const auto zero_us = time::to_chrono(make_microseconds(0));
|
the<deferrer>().active_safe_wait_promise(p);
|
||||||
while ( p.wait_for(zero_us) == stdex::promise_wait_status::timeout ) {
|
|
||||||
if ( 0 == the<deferrer>().scheduler().process_one_task().second ) {
|
|
||||||
std::this_thread::yield();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return p.get_or_default(nullptr);
|
return p.get_or_default(nullptr);
|
||||||
|
|||||||
Reference in New Issue
Block a user