void*   btAlignedAllocInternal  (size_t size, int alignment,int line,char* filename)
{
 void *ret;
 char *real;

 gTotalBytesAlignedAllocs += size;
 gNumAlignedAllocs++;

 
 real = (char *)sAllocFunc(size + 2*sizeof(void *) + (alignment-1));
 if (real) {
   ret = (void*) btAlignPointer(real + 2*sizeof(void *), alignment);
   *((void **)(ret)-1) = (void *)(real);
       *((int*)(ret)-2) = size;

 } else {
   ret = (void *)(real);//??
 }

 printf("allocation#%d at address %x, from %s,line %d, size %d\n",gNumAlignedAllocs,real, filename,line,size);

 int* ptr = (int*)ret;
 *ptr = 12;
 return (ret);
}
void*   btAlignedAllocInternal  (size_t size, int alignment,int line,char* filename)
{
	if (size==0)
	{
		printf("Whaat? size==0");
		return 0;
	}
	static int allocId = 0;
	
 void *ret;
 char *real;

// to find some particular memory leak, you could do something like this:
//	if (allocId==172)
//	{
//		printf("catch me!\n");
//	}
//	if (size>1024*1024)
//	{
//		printf("big alloc!%d\n", size);
//	}

 gTotalBytesAlignedAllocs += size;
 gNumAlignedAllocs++;

 
int sz4prt = 4*sizeof(void *);
	
 real = (char *)sAllocFunc(size + sz4prt + (alignment-1));
 if (real) {
	 
   ret = (void*) btAlignPointer(real + sz4prt, alignment);
	 btDebugPtrMagic p;
	 p.vptr = ret;
	 p.cptr-=sizeof(void*);
	 *p.vptrptr = (void*)real;
	 p.cptr-=sizeof(void*);
	 *p.iptr = size;
	 p.cptr-=sizeof(void*);
	 *p.iptr = allocId;
	 
	 allocations_id[mynumallocs] = allocId;
	 allocations_bytes[mynumallocs] = size;
	 mynumallocs++;

 } else {
   ret = (void *)(real);//??
 }

 printf("allocation %d at address %x, from %s,line %d, size %d (total allocated = %d)\n",allocId,real, filename,line,size,gTotalBytesAlignedAllocs);
	allocId++;
	
 int* ptr = (int*)ret;
 *ptr = 12;
 return (ret);
}
static inline void *btAlignedAllocDefault(size_t size, int alignment)
{
  void *ret;
  char *real;
  real = (char *)sAllocFunc(size + sizeof(void *) + (alignment-1));
  if (real) {
	ret = btAlignPointer(real + sizeof(void *),alignment);
    *((void **)(ret)-1) = (void *)(real);
  } else {
    ret = (void *)(real);
  }
  return (ret);
}
static inline void* btAlignedAllocDefault(size_t size, int32_t alignment)
{
    void* ret;
    char* real;
    unsigned long offset;

    real = (char*)sAllocFunc(size + sizeof(void*) + (alignment - 1));
    if (real) {
        // -- GODOT start --
        // Synced with Bullet 2.88 to fix GH-27926
        //offset = (alignment - (unsigned long)(real + sizeof(void*))) & (alignment - 1);
        //ret = (void*)((real + sizeof(void*)) + offset);
        ret = btAlignPointer(real + sizeof(void *), alignment);
        // -- GODOT end --
        *((void**)(ret)-1) = (void*)(real);
    }
    else {
        ret = (void*)(real);
    }
    return (ret);
}