Log.m 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //
  2. // Log.m
  3. // GlucoseLink
  4. //
  5. // Created by Pete Schwamb on 2/22/15.
  6. // Copyright (c) 2015 Pete Schwamb. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import "mach/mach.h"
  10. #import "Log.h"
  11. NSMutableArray *logEntries = nil;
  12. @implementation Log
  13. vm_size_t usedMemory(void) {
  14. struct task_basic_info info;
  15. mach_msg_type_number_t size = sizeof(info);
  16. kern_return_t kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size);
  17. return (kerr == KERN_SUCCESS) ? info.resident_size : 0; // size in bytes
  18. }
  19. vm_size_t freeMemory(void) {
  20. mach_port_t host_port = mach_host_self();
  21. mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
  22. vm_size_t pagesize;
  23. vm_statistics_data_t vm_stat;
  24. host_page_size(host_port, &pagesize);
  25. (void) host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
  26. return vm_stat.free_count * pagesize;
  27. }
  28. void logMemUsage(void) {
  29. // compute memory usage and log if different by >= 100k
  30. static long prevMemUsage = 0;
  31. long curMemUsage = usedMemory();
  32. long memUsageDiff = curMemUsage - prevMemUsage;
  33. if (memUsageDiff > 100000 || memUsageDiff < -100000) {
  34. prevMemUsage = curMemUsage;
  35. NSLog(@"Memory used %7.1f (%+5.0f), free %7.1f kb", curMemUsage/1000.0f, memUsageDiff/1000.0f, freeMemory()/1000.0f);
  36. }
  37. }
  38. + (NSArray*) popLogEntries {
  39. NSArray *rval = logEntries;
  40. logEntries = [NSMutableArray array];
  41. if (rval == nil) {
  42. rval = [NSMutableArray array];
  43. }
  44. return rval;
  45. }
  46. void append(NSString *msg){
  47. if (logEntries == nil) {
  48. logEntries = [NSMutableArray array];
  49. }
  50. #ifdef LOG_TO_NS
  51. [logEntries addObject:msg];
  52. #endif
  53. // get path to Documents/somefile.txt
  54. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  55. NSString *documentsDirectory = paths[0];
  56. NSString *path = [documentsDirectory stringByAppendingPathComponent:@"logfile.txt"];
  57. // create if needed
  58. if (![[NSFileManager defaultManager] fileExistsAtPath:path]){
  59. fprintf(stderr,"Creating file at %s",path.UTF8String);
  60. [[NSData data] writeToFile:path atomically:YES];
  61. }
  62. // append
  63. NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:path];
  64. [handle truncateFileAtOffset:[handle seekToEndOfFile]];
  65. [handle writeData:[msg dataUsingEncoding:NSUTF8StringEncoding]];
  66. [handle closeFile];
  67. }
  68. void _Log(NSString *prefix, const char *file, int lineNumber, const char *funcName, NSString *format,...) {
  69. static NSDateFormatter *dateFormat = nil;
  70. if (nil == dateFormat) {
  71. dateFormat = [[NSDateFormatter alloc] init]; // NOT NSDateFormatter *dateFormat = ...
  72. dateFormat.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSS";
  73. }
  74. va_list ap;
  75. va_start (ap, format);
  76. format = [format stringByAppendingString:@"\n"];
  77. NSDate *time = [NSDate date];
  78. NSString *msg = [[NSString alloc] initWithFormat:[NSString stringWithFormat:@"%@: %@", [dateFormat stringFromDate:time], format] arguments:ap];
  79. va_end (ap);
  80. fprintf(stderr,"%s", msg.UTF8String);
  81. append(msg);
  82. }
  83. @end