
#include <proto/exec.h>
#include <exec/semaphores.h>

extern struct SignalSemaphore mem_sema;

void *
AllocVecPooled (void *poolHeader, ULONG memSize)
{
  ULONG *ptr;

  ObtainSemaphore (&mem_sema);
  ptr = (ULONG *) AllocPooled (poolHeader, memSize + sizeof (ULONG));
  ReleaseSemaphore (&mem_sema);

  if (!ptr)
    return (NULL);

  *ptr++ = memSize + sizeof (ULONG);
  return ((void *) ptr);

}


void
FreeVecPooled (void *poolHeader, void *memory)
{
  ULONG *ptr, size;

  if (memory)
    {
      ptr = (ULONG *) memory;
      size = *--ptr;

      ObtainSemaphore (&mem_sema);
      FreePooled (poolHeader, (void *) ptr, size);
      ReleaseSemaphore (&mem_sema);
    }
}

void *
AllocSPooled (void *poolHeader, ULONG memSize)
{
  ULONG *ptr;

  ObtainSemaphore (&mem_sema);
  ptr = (ULONG *) AllocPooled (poolHeader, memSize);
  ReleaseSemaphore (&mem_sema);

  return ((void *) ptr);

}


void
FreeSPooled (void *poolHeader, void *memory, ULONG size)
{
  if (memory)
    {
      ObtainSemaphore (&mem_sema);
      FreePooled (poolHeader, memory, size);
      ReleaseSemaphore (&mem_sema);
    }
}
