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

// +build !libc.membrk,!libc.memgrind

package libc // import "modernc.org/libc"

import (
	
	
	
)

const memgrind = false

var (
	allocator memory.Allocator
)

// void *malloc(size_t size);
func ( *TLS,  types.Size_t) uintptr {
	if  == 0 {
		return 0
	}

	allocMu.Lock()

	defer allocMu.Unlock()

	,  := allocator.UintptrMalloc(int())
	if  != nil {
		.setErrno(errno.ENOMEM)
		return 0
	}

	return 
}

// void *calloc(size_t nmemb, size_t size);
func ( *TLS, ,  types.Size_t) uintptr {
	 := int( * )
	if  == 0 {
		return 0
	}

	allocMu.Lock()

	defer allocMu.Unlock()

	,  := allocator.UintptrCalloc(int( * ))
	if  != nil {
		.setErrno(errno.ENOMEM)
		return 0
	}

	return 
}

// void *realloc(void *ptr, size_t size);
func ( *TLS,  uintptr,  types.Size_t) uintptr {
	allocMu.Lock()

	defer allocMu.Unlock()

	,  := allocator.UintptrRealloc(, int())
	if  != nil {
		.setErrno(errno.ENOMEM)
		return 0
	}

	return 
}

// void free(void *ptr);
func ( *TLS,  uintptr) {
	if  == 0 {
		return
	}

	allocMu.Lock()

	defer allocMu.Unlock()

	allocator.UintptrFree()
}

func ( uintptr) types.Size_t {
	allocMu.Lock()

	defer allocMu.Unlock()

	return types.Size_t(memory.UintptrUsableSize())
}

// MemAuditStart locks the memory allocator, initializes and enables memory
// auditing. Finaly it unlocks the memory allocator.
//
// Some memory handling errors, like double free or freeing of unallocated
// memory, will panic when memory auditing is enabled.
//
// This memory auditing functionality has to be enabled using the libc.memgrind
// build tag.
//
// It is intended only for debug/test builds. It slows down memory allocation
// routines and it has additional memory costs.
func () {}

// MemAuditReport locks the memory allocator, reports memory leaks, if any.
// Finally it disables memory auditing and unlocks the memory allocator.
//
// This memory auditing functionality has to be enabled using the libc.memgrind
// build tag.
//
// It is intended only for debug/test builds. It slows down memory allocation
// routines and it has additional memory costs.
func () error { return nil }