macos_appnap.mm raw

   1  // Copyright (c) 2011-present The Bitcoin Core developers
   2  // Distributed under the MIT software license, see the accompanying
   3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   4  
   5  #include "macos_appnap.h"
   6  
   7  #include <AvailabilityMacros.h>
   8  #include <Foundation/NSProcessInfo.h>
   9  #include <Foundation/Foundation.h>
  10  
  11  class CAppNapInhibitor::CAppNapImpl
  12  {
  13  public:
  14      ~CAppNapImpl()
  15      {
  16          if(activityId)
  17              enableAppNap();
  18      }
  19  
  20      void disableAppNap()
  21      {
  22          if (!activityId)
  23          {
  24              @autoreleasepool {
  25                  const NSActivityOptions activityOptions =
  26                  NSActivityUserInitiatedAllowingIdleSystemSleep &
  27                  ~(NSActivitySuddenTerminationDisabled |
  28                  NSActivityAutomaticTerminationDisabled);
  29  
  30                  id processInfo = [NSProcessInfo processInfo];
  31                  if ([processInfo respondsToSelector:@selector(beginActivityWithOptions:reason:)])
  32                  {
  33                      activityId = [processInfo beginActivityWithOptions: activityOptions reason:@"Temporarily disable App Nap for bitcoin-qt."];
  34                      [activityId retain];
  35                  }
  36              }
  37          }
  38      }
  39  
  40      void enableAppNap()
  41      {
  42          if(activityId)
  43          {
  44              @autoreleasepool {
  45                  id processInfo = [NSProcessInfo processInfo];
  46                  if ([processInfo respondsToSelector:@selector(endActivity:)])
  47                      [processInfo endActivity:activityId];
  48  
  49                  [activityId release];
  50                  activityId = nil;
  51              }
  52          }
  53      }
  54  
  55  private:
  56      NSObject* activityId;
  57  };
  58  
  59  CAppNapInhibitor::CAppNapInhibitor() : impl(new CAppNapImpl()) {}
  60  
  61  CAppNapInhibitor::~CAppNapInhibitor() = default;
  62  
  63  void CAppNapInhibitor::disableAppNap()
  64  {
  65      impl->disableAppNap();
  66  }
  67  
  68  void CAppNapInhibitor::enableAppNap()
  69  {
  70      impl->enableAppNap();
  71  }
  72