Fix IO memory access .. SB128 driver makes noises in VMWare - CMI is untested (Curren...
[AROS.git] / rom / exec / memory.h
blob8cdb6c2846ae5f9c9133b4da9a9fe69b25c2eb3f
1 /*
2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc:
6 Lang:
7 */
8 #ifndef _MEMORY_H_
9 #define _MEMORY_H_
11 #include <exec/lists.h>
12 #include <exec/semaphores.h>
13 #include <exec/memory.h>
14 #include <stddef.h>
17 * EXPERIMENTAL: use semaphore protection instead of Forbid()/Permit() for
18 * system memory allocation routines.
19 * In case of problems use definitions below.
21 * 31.01.2011: disabled, because creates problems:
22 * 1. FindMem() can be called from within supervisor mode
23 * 2. FreeMem() can be called from within RemTask() in order to free task structure itself.
24 * This eventually leads to trashing memory (semaphore is owned by removed task).
25 * Can be turned on again only after addressing these issues.
27 #define MEM_LOCK ObtainSemaphore(&PrivExecBase(SysBase)->MemListSem)
28 #define MEM_LOCK_SHARED ObtainSemaphoreShared(&PrivExecBase(SysBase)->MemListSem)
29 #define MEM_UNLOCK ReleaseSemaphore(&PrivExecBase(SysBase)->MemListSem)
31 #define MEM_LOCK Forbid()
32 #define MEM_LOCK_SHARED Forbid()
33 #define MEM_UNLOCK Permit()
36 /* Private Pool structure */
37 struct Pool
39 struct MinList PuddleList;
40 ULONG Requirements;
41 ULONG PuddleSize;
44 struct ProtectedPool
46 struct Pool pool;
47 struct SignalSemaphore sem;
50 struct Block
52 struct MinNode Node;
53 ULONG Size;
56 struct checkMemHandlersState
58 struct Node *cmhs_CurNode;
59 struct MemHandlerData cmhs_Data;
62 struct MemHeader *FindMem(APTR address, struct ExecBase *SysBase);
63 APTR stdAlloc(struct MemHeader *mh, IPTR byteSize, ULONG requirements, struct ExecBase *SysBase);
64 void stdDealloc(struct MemHeader *freeList, APTR memoryBlock, IPTR byteSize, struct ExecBase *SysBase);
66 APTR InternalAllocAbs(APTR location, IPTR byteSize, struct ExecBase *SysBase);
67 void InternalFreeMem(APTR location, IPTR byteSize, struct ExecBase *SysBase);
68 APTR AllocMemHeader(IPTR size, ULONG flags, struct ExecBase *SysBase);
69 void FreeMemHeader(APTR addr, struct ExecBase *SysBase);
71 APTR InternalAllocPooled(APTR poolHeader, IPTR memSize, ULONG flags, const char *function, APTR caller, struct ExecBase *SysBase);
72 void InternalFreePooled(APTR memory, IPTR memSize, const char *function, APTR caller, APTR stack, struct ExecBase *SysBase);
74 ULONG checkMemHandlers(struct checkMemHandlersState *cmhs, struct ExecBase *SysBase);
76 APTR nommu_AllocMem(IPTR byteSize, ULONG flags, struct ExecBase *SysBase);
77 APTR nommu_AllocAbs(APTR location, IPTR byteSize, struct ExecBase *SysBase);
78 void nommu_FreeMem(APTR memoryBlock, IPTR byteSize, struct ExecBase *SysBase);
79 IPTR nommu_AvailMem(ULONG attributes, struct ExecBase *SysBase);
81 #define BLOCK_TOTAL \
82 ((sizeof(struct Block)+AROS_WORSTALIGN-1)&~(AROS_WORSTALIGN-1))
84 #endif