blob: 108d538f63715c04e2d7f7e87e3f392d52c0da5e [file] [log] [blame]
// 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.
#ifndef gc_JSCUSTOMALLOCATOR_H
#define gc_JSCUSTOMALLOCATOR_H
#include <algorithm>
#include "jstypes.h"
#include "memory_allocator_reporter.h"
#include "nb/memory_scope.h"
#include "starboard/memory.h"
#include "starboard/string.h"
#include "starboard/types.h"
#define JS_OOM_POSSIBLY_FAIL() do {} while(0)
#define JS_OOM_POSSIBLY_FAIL_REPORT(cx) do {} while(0)
static JS_INLINE void* js_malloc(size_t bytes) {
TRACK_MEMORY_SCOPE("Javascript");
size_t reservation_bytes = AllocationMetadata::GetReservationBytes(bytes);
MemoryAllocatorReporter::Get()->UpdateAllocatedBytes(reservation_bytes);
void* metadata = SbMemoryAllocate(reservation_bytes);
AllocationMetadata::SetSizeToBaseAddress(metadata, reservation_bytes);
return AllocationMetadata::GetUserAddressFromBaseAddress(metadata);
}
static JS_INLINE void* js_calloc(size_t nmemb, size_t size) {
size_t total_size = nmemb * size;
void* memory = js_malloc(total_size);
if (memory) {
SbMemorySet(memory, 0, total_size);
}
return memory;
}
static JS_INLINE void* js_calloc(size_t bytes) {
return js_calloc(bytes, 1);
}
static JS_INLINE void js_free(void* p) {
if (p == NULL) {
return;
}
AllocationMetadata* metadata =
AllocationMetadata::GetMetadataFromUserAddress(p);
MemoryAllocatorReporter::Get()->UpdateAllocatedBytes(-static_cast<ssize_t>(
AllocationMetadata::GetSizeOfAllocationFromMetadata(metadata)));
SbMemoryDeallocate(metadata);
}
static JS_INLINE void* js_realloc(void* p, size_t bytes) {
TRACK_MEMORY_SCOPE("Javascript");
AllocationMetadata* metadata =
AllocationMetadata::GetMetadataFromUserAddress(p);
size_t current_size =
AllocationMetadata::GetSizeOfAllocationFromMetadata(metadata);
size_t adjusted_size = AllocationMetadata::GetReservationBytes(bytes);
MemoryAllocatorReporter::Get()->UpdateAllocatedBytes(
static_cast<ssize_t>(adjusted_size - current_size));
void* new_ptr = SbMemoryReallocate(metadata, adjusted_size);
AllocationMetadata::SetSizeToBaseAddress(new_ptr, adjusted_size);
return AllocationMetadata::GetUserAddressFromBaseAddress(new_ptr);
}
static JS_INLINE char* js_strdup(char* s) {
TRACK_MEMORY_SCOPE("Javascript");
size_t length = SbStringGetLength(s) + 1;
char* new_ptr = reinterpret_cast<char*>(js_malloc(length));
SbStringCopy(new_ptr, s, length);
return new_ptr;
}
#endif /* gc_JSCUSTOMALLOCATOR_H */