/* Memory object priority demo for VirtualMem */
/* Written by Kalle Sandström */

#include <exec/types.h>
#include <exec/memory.h>
#include <exec/libraries.h>
#include <libraries/virtualmem.h>

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

#define BLOCKCOUNT 80	/* How many 64K blocks to allocate? */

#ifdef __GNUC__
int __nocommandline=TRUE;
#endif /* __GNUC__ */

struct Library *VirtualMemBase;

int main()
{
  APTR blocks[BLOCKCOUNT+1];
  UBYTE i;

  if(!(VirtualMemBase=OpenLibrary(VIRTUALMEMNAME,0L)))exit(20);
  for(i=0;i<BLOCKCOUNT-1;i++)blocks[i]=NULL;
  for(i=0;i<BLOCKCOUNT-1;i++)
  {
    blocks[i]=CreateVMem(65536,MEMF_CLEAR,0,NULL);
    printf("%s %d\n",blocks[i]?"Got":"Failed",i);
    if(blocks[i])
    {
      STRPTR strmem;

      if(strmem=LockVMem(blocks[i]))
      {
        sprintf(strmem,"Old McDonald had a hamburger stand, ei-ei-o (%d)",i);
        UnlockVMem(blocks[i]);
      }
    }
  }
  blocks[BLOCKCOUNT]=NULL;
  AutoAdjustPri(blocks);
  for(i=0;i<BLOCKCOUNT-1;i++)
  {
    if(blocks[i])
    {
      STRPTR mem;

      if(mem=LockVMem(blocks[i]))
      {
        printf("Locked %d (\"%s\")\n",i,mem);
        UnlockVMem(blocks[i]);
      } else printf("Didn't lock %d\n",i);
      ChangeVMemPri(blocks[i],-BLOCKCOUNT);
    }
  }
  for(i=0;i<BLOCKCOUNT-1;i++)if(blocks[i])RemoveVMem(blocks[i]);
  CloseLibrary(VirtualMemBase);
}
