| // Copyright 2022 The Crashpad Authors |
| // |
| // 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. |
| |
| #include "util/ios/scoped_background_task.h" |
| |
| #import <Foundation/Foundation.h> |
| |
| namespace crashpad { |
| namespace internal { |
| |
| ScopedBackgroundTask::ScopedBackgroundTask(const char* task_name) |
| : task_complete_semaphore_(dispatch_semaphore_create(0)) { |
| __weak dispatch_semaphore_t weak_task_complete_semaphore = |
| task_complete_semaphore_; |
| NSString* name = [NSString stringWithUTF8String:task_name]; |
| [[NSProcessInfo processInfo] |
| performExpiringActivityWithReason:name |
| usingBlock:^(BOOL expired) { |
| if (expired) { |
| // TODO(crbug.com/crashpad/400): Notify the |
| // BG task creator that time's up -- this will |
| // be useful for BackgroundTasks and |
| // NSURLSessions. |
| return; |
| } |
| __strong dispatch_semaphore_t |
| strong_task_complete_semaphore = |
| weak_task_complete_semaphore; |
| if (!strong_task_complete_semaphore) { |
| return; |
| } |
| dispatch_semaphore_wait( |
| strong_task_complete_semaphore, |
| DISPATCH_TIME_FOREVER); |
| }]; |
| } |
| |
| ScopedBackgroundTask::~ScopedBackgroundTask() { |
| dispatch_semaphore_signal(task_complete_semaphore_); |
| } |
| |
| } // namespace internal |
| } // namespace crashpad |