/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "chre/platform/memory.h"
#include "chre/platform/slpi/memory.h"

#ifdef CHRE_SLPI_SEE
#include "chre/platform/slpi/see/island_vote_client.h"
#endif

#include <cstdlib>

extern "C" {

#ifdef CHRE_SLPI_UIMG_ENABLED
#include "sns_island_util.h"
#include "sns_memmgr.h"
#endif  // CHRE_SLPI_UIMG_ENABLED

}  // extern "C"

namespace chre {

void *memoryAlloc(size_t size) {
#ifdef CHRE_SLPI_UIMG_ENABLED
  void *ptr = sns_malloc(SNS_HEAP_CHRE_ISLAND, size);

  // Fall back to big image memory when uimg memory is exhausted.
  // Must exclude size 0 as clients may not explicitly free memory of size 0,
  // which may mistakenly hold the system in big image.
  if (ptr == nullptr && size != 0) {
    // Increment big image ref count to prevent system from entering uimg
    // while big image memory is in use.
    IslandVoteClientSingleton::get()->incrementBigImageRefCount();
    ptr = memoryAllocBigImage(size);

    // Big image allocation failed too.
    if (ptr == nullptr) {
      IslandVoteClientSingleton::get()->decrementBigImageRefCount();
    }
  }

  return ptr;
#else
  return malloc(size);
#endif  // CHRE_SLPI_UIMG_ENABLED
}

void *memoryAllocBigImage(size_t size) {
  return malloc(size);
}

void *palSystemApiMemoryAlloc(size_t size) {
  return malloc(size);
}

void memoryFree(void *pointer) {
#ifdef CHRE_SLPI_UIMG_ENABLED
  if (sns_island_is_island_ptr(reinterpret_cast<intptr_t>(pointer))) {
    sns_free(pointer);
  } else {
    memoryFreeBigImage(pointer);

    // Must exclude nullptr as it's excluded in memoryAlloc() as well.
    // Note currently sns_island_is_island_ptr returns true for nullptr,
    // so this mainly serves as a protection in case the implementation of
    // sns_island_is_island_ptr changes in the future.
    if (pointer != nullptr) {
      IslandVoteClientSingleton::get()->decrementBigImageRefCount();
    }
  }
#else
  free(pointer);
#endif  // CHRE_SLPI_UIMG_ENABLED
}

void memoryFreeBigImage(void *pointer) {
  free(pointer);
}

void palSystemApiMemoryFree(void *pointer) {
  free(pointer);
}

}  // namespace chre
