// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/process_util_unittest_mac.h"

#import <Foundation/Foundation.h>
#include <CoreFoundation/CoreFoundation.h>

#if !defined(ARCH_CPU_64_BITS)

// In the 64-bit environment, the Objective-C 2.0 Runtime Reference states
// that sizeof(anInstance) is constrained to 32 bits. That's not necessarily
// "psychotically big" and in fact a 64-bit program is expected to be able to
// successfully allocate an object that large, likely reserving a good deal of
// swap space. The only way to test the behavior of memory exhaustion for
// Objective-C allocation in this environment would be to loop over allocation
// of these large objects, but that would slowly consume all available memory
// and cause swap file proliferation. That's bad, so this behavior isn't
// tested in the 64-bit environment.

@interface PsychoticallyBigObjCObject : NSObject
{
  // In the 32-bit environment, the compiler limits Objective-C objects to
  // < 2GB in size.
  int justUnder2Gigs_[(2U * 1024 * 1024 * 1024 - 1) / sizeof(int)];
}

@end

@implementation PsychoticallyBigObjCObject

@end

namespace base {

void* AllocatePsychoticallyBigObjCObject() {
  return [[PsychoticallyBigObjCObject alloc] init];
}

}  // namespace base

#endif  // ARCH_CPU_64_BITS

namespace base {

void* AllocateViaCFAllocatorSystemDefault(ssize_t size) {
  return CFAllocatorAllocate(kCFAllocatorSystemDefault, size, 0);
}

void* AllocateViaCFAllocatorMalloc(ssize_t size) {
  return CFAllocatorAllocate(kCFAllocatorMalloc, size, 0);
}

void* AllocateViaCFAllocatorMallocZone(ssize_t size) {
  return CFAllocatorAllocate(kCFAllocatorMallocZone, size, 0);
}

}  // namespace base
