Index: webrtc/examples/objc/AppRTCDemo/common/ARDUtilities.m |
diff --git a/webrtc/examples/objc/AppRTCDemo/common/ARDUtilities.m b/webrtc/examples/objc/AppRTCDemo/common/ARDUtilities.m |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c9d029f629d13a3111daa3d46f8aa16f8d963cbe |
--- /dev/null |
+++ b/webrtc/examples/objc/AppRTCDemo/common/ARDUtilities.m |
@@ -0,0 +1,128 @@ |
+/* |
+ * Copyright 2014 The WebRTC Project Authors. All rights reserved. |
+ * |
+ * Use of this source code is governed by a BSD-style license |
+ * that can be found in the LICENSE file in the root of the source |
+ * tree. An additional intellectual property rights grant can be found |
+ * in the file PATENTS. All contributing project authors may |
+ * be found in the AUTHORS file in the root of the source tree. |
+ */ |
+ |
+#import "ARDUtilities.h" |
+ |
+#import <mach/mach.h> |
+ |
+#import "WebRTC/RTCLogging.h" |
+ |
+@implementation NSDictionary (ARDUtilites) |
+ |
++ (NSDictionary *)dictionaryWithJSONString:(NSString *)jsonString { |
+ NSParameterAssert(jsonString.length > 0); |
+ NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; |
+ NSError *error = nil; |
+ NSDictionary *dict = |
+ [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; |
+ if (error) { |
+ RTCLogError(@"Error parsing JSON: %@", error.localizedDescription); |
+ } |
+ return dict; |
+} |
+ |
++ (NSDictionary *)dictionaryWithJSONData:(NSData *)jsonData { |
+ NSError *error = nil; |
+ NSDictionary *dict = |
+ [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; |
+ if (error) { |
+ RTCLogError(@"Error parsing JSON: %@", error.localizedDescription); |
+ } |
+ return dict; |
+} |
+ |
+@end |
+ |
+@implementation NSURLConnection (ARDUtilities) |
+ |
++ (void)sendAsyncRequest:(NSURLRequest *)request |
+ completionHandler:(void (^)(NSURLResponse *response, |
+ NSData *data, |
+ NSError *error))completionHandler { |
+ // Kick off an async request which will call back on main thread. |
+ [NSURLConnection sendAsynchronousRequest:request |
+ queue:[NSOperationQueue mainQueue] |
+ completionHandler:^(NSURLResponse *response, |
+ NSData *data, |
+ NSError *error) { |
+ if (completionHandler) { |
+ completionHandler(response, data, error); |
+ } |
+ }]; |
+} |
+ |
+// Posts data to the specified URL. |
++ (void)sendAsyncPostToURL:(NSURL *)url |
+ withData:(NSData *)data |
+ completionHandler:(void (^)(BOOL succeeded, |
+ NSData *data))completionHandler { |
+ NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; |
+ request.HTTPMethod = @"POST"; |
+ request.HTTPBody = data; |
+ [[self class] sendAsyncRequest:request |
+ completionHandler:^(NSURLResponse *response, |
+ NSData *data, |
+ NSError *error) { |
+ if (error) { |
+ RTCLogError(@"Error posting data: %@", error.localizedDescription); |
+ if (completionHandler) { |
+ completionHandler(NO, data); |
+ } |
+ return; |
+ } |
+ NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; |
+ if (httpResponse.statusCode != 200) { |
+ NSString *serverResponse = data.length > 0 ? |
+ [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] : |
+ nil; |
+ RTCLogError(@"Received bad response: %@", serverResponse); |
+ if (completionHandler) { |
+ completionHandler(NO, data); |
+ } |
+ return; |
+ } |
+ if (completionHandler) { |
+ completionHandler(YES, data); |
+ } |
+ }]; |
+} |
+ |
+@end |
+ |
+NSInteger ARDGetCpuUsagePercentage() { |
+ // Create an array of thread ports for the current task. |
+ const task_t task = mach_task_self(); |
+ thread_act_array_t thread_array; |
+ mach_msg_type_number_t thread_count; |
+ if (task_threads(task, &thread_array, &thread_count) != KERN_SUCCESS) { |
+ return -1; |
+ } |
+ |
+ // Sum cpu usage from all threads. |
+ float cpu_usage_percentage = 0; |
+ thread_basic_info_data_t thread_info_data = {}; |
+ mach_msg_type_number_t thread_info_count; |
+ for (size_t i = 0; i < thread_count; ++i) { |
+ thread_info_count = THREAD_BASIC_INFO_COUNT; |
+ kern_return_t ret = thread_info(thread_array[i], |
+ THREAD_BASIC_INFO, |
+ (thread_info_t)&thread_info_data, |
+ &thread_info_count); |
+ if (ret == KERN_SUCCESS) { |
+ cpu_usage_percentage += |
+ 100.f * (float)thread_info_data.cpu_usage / TH_USAGE_SCALE; |
+ } |
+ } |
+ |
+ // Dealloc the created array. |
+ vm_deallocate(task, (vm_address_t)thread_array, |
+ sizeof(thread_act_t) * thread_count); |
+ return lroundf(cpu_usage_percentage); |
+} |