| // Copyright 2017 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef STARBOARD_SHARED_UWP_ASYNC_UTILS_H_ |
| #define STARBOARD_SHARED_UWP_ASYNC_UTILS_H_ |
| |
| #include <windows.h> |
| |
| #include <ppltasks.h> |
| |
| #include "starboard/common/log.h" |
| |
| using Windows::Foundation::IAsyncAction; |
| using Windows::Foundation::IAsyncOperation; |
| |
| namespace starboard { |
| namespace shared { |
| namespace uwp { |
| |
| template <typename TResult> |
| TResult WaitForResult(IAsyncOperation<TResult> ^ operation) { |
| using concurrency::task_continuation_context; |
| HANDLE event = CreateEvent(nullptr, TRUE, FALSE, nullptr); |
| concurrency::create_task(operation, |
| task_continuation_context::use_arbitrary()) |
| .then( |
| [&event](TResult result) { |
| BOOL success = SetEvent(event); |
| SB_DCHECK(success); |
| }, |
| task_continuation_context::use_arbitrary()); |
| DWORD return_value = WaitForSingleObject(event, INFINITE); |
| SB_DCHECK(return_value == WAIT_OBJECT_0); |
| CloseHandle(event); |
| return operation->GetResults(); |
| } |
| |
| inline void WaitForComplete(IAsyncAction ^ action) { |
| using concurrency::task_continuation_context; |
| HANDLE event = CreateEvent(nullptr, TRUE, FALSE, nullptr); |
| concurrency::create_task(action, task_continuation_context::use_arbitrary()) |
| .then( |
| [&event](void) { |
| BOOL success = SetEvent(event); |
| SB_DCHECK(success); |
| }, |
| task_continuation_context::use_arbitrary()); |
| DWORD return_value = WaitForSingleObject(event, INFINITE); |
| SB_DCHECK(return_value == WAIT_OBJECT_0); |
| CloseHandle(event); |
| } |
| |
| } // namespace uwp |
| } // namespace shared |
| } // namespace starboard |
| |
| #endif // STARBOARD_SHARED_UWP_ASYNC_UTILS_H_ |