// Copyright 2016 Google Inc. All Rights Reserved.
//
// 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.

// Module Overview: Memory Reporting API.
//
// Provides an interface for memory reporting.

#ifndef STARBOARD_MEMORY_REPORTER_H_
#define STARBOARD_MEMORY_REPORTER_H_

#include "starboard/configuration.h"
#include "starboard/export.h"
#include "starboard/types.h"

#ifdef __cplusplus
extern "C" {
#endif

///////////////////////////////////////////////////////////////////////////////
// These are callbacks used by SbMemoryReporter to report memory
// allocation and deallocation.
///////////////////////////////////////////////////////////////////////////////

// A function to report a memory allocation from SbMemoryAllocate(). Note that
// operator new calls SbMemoryAllocate which will delegate to this callback.
typedef void (*SbMemoryReporterOnAlloc)(void* context, const void* memory,
                                        size_t size);

// A function to report a memory deallocation from SbMemoryDeallcoate(). Note
// that operator delete calls SbMemoryDeallocate which will delegate to this
// callback.
typedef void (*SbMemoryReporterOnDealloc)(void* context, const void* memory);

// A function to report a memory mapping from SbMemoryMap().
typedef void (*SbMemoryReporterOnMapMemory)(void* context, const void* memory,
                                            size_t size);

// A function to report a memory unmapping from SbMemoryUnmap().
typedef void (*SbMemoryReporterOnUnMapMemory)(void* context,
                                              const void* memory,
                                              size_t size);

// SbMemoryReporter allows memory reporting via user-supplied functions.
// The void* context is passed to every call back.
// It's strongly recommended that C-Style struct initialization is used
// so that the arguments can be typed check by the compiler.
// For example,
//  SbMemoryReporter mem_reporter = { MallocCallback, .... context };
struct SbMemoryReporter {
  // Callback to report allocations.
  SbMemoryReporterOnAlloc on_alloc_cb;

  // Callback to report deallocations.
  SbMemoryReporterOnDealloc on_dealloc_cb;

  // Callback to report memory map.
  SbMemoryReporterOnMapMemory on_mapmem_cb;

  // Callback to report memory unmap.
  SbMemoryReporterOnUnMapMemory on_unmapmem_cb;

  // Optional, is passed to callbacks as first argument.
  void* context;
};

// Sets the MemoryReporter. Any previous memory reporter is unset. No lifetime
// management is done internally on input pointer.
//
// Returns true if the memory reporter was set with no errors. If an error
// was reported then check the log for why it failed.
//
// Note that other than a thread-barrier-write of the input pointer, there is
// no thread safety guarantees with this function due to performance
// considerations. It's recommended that this be called once during the
// lifetime of the program, or not at all. Do not delete the supplied pointer,
// ever.
// Example (Good):
//    SbMemoryReporter* mem_reporter = new ...;
//    SbMemorySetReporter(&mem_reporter);
//    ...
//    SbMemorySetReporter(NULL);  // allow value to leak.
// Example (Bad):
//    SbMemoryReporter* mem_reporter = new ...;
//    SbMemorySetReporter(&mem_reporter);
//    ...
//    SbMemorySetReporter(NULL);
//    delete mem_reporter;        // May crash.
SB_EXPORT bool SbMemorySetReporter(struct SbMemoryReporter* tracker);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // STARBOARD_MEMORY_REPORTER_H_
