chromium/tools/android/memconsumer/memconsumer_hook.cc

// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <android/log.h>
#include <jni.h>
#include <stdio.h>
#include <string.h>
#include <cstdlib>

extern "C" {
JNIEXPORT void JNICALL
    Java_org_chromium_memconsumer_ResidentService_nativeUseMemory(JNIEnv* env,
                                                                  jobject clazz,
                                                                  jlong memory);
}

namespace {

uint32_t get_random() {
  static uint32_t m_w = 1;
  static uint32_t m_z = 1;
  m_z = 36969 * (m_z & 65535) + (m_z >> 16);
  m_w = 18000 * (m_w & 65535) + (m_w >> 16);
  return (m_z << 16) + m_w;
}

}  // namespace

JNIEXPORT void JNICALL
    Java_org_chromium_memconsumer_ResidentService_nativeUseMemory(
        JNIEnv* env,
        jobject clazz,
        jlong memory) {
  static uint32_t* g_memory = NULL;
  if (g_memory)
    free(g_memory);
  if (memory == 0) {
    g_memory = NULL;
    return;
  }
  g_memory = static_cast<uint32_t*>(malloc(memory));
  if (!g_memory) {
    __android_log_print(ANDROID_LOG_WARN, "MemConsumer",
                        "Unable to allocate %lld bytes",
                        static_cast<long long>(memory));
  }
  // If memory allocation failed, try to allocate as much as possible.
  while (!g_memory) {
    memory /= 2;
    g_memory = static_cast<uint32_t*>(malloc(memory));
  }
  for (int i = 0; i < memory / sizeof(uint32_t); ++i)
    *(g_memory + i) = get_random();
}