Improvements to AutoDocs and comments.
[aros:aros.git] / AROS / workbench / libs / icon / addfreelist.c
1 /*
2     Copyright © 1995-2013, The AROS Development Team. All rights reserved.
3     $Id$
4
5     Desc:
6     Lang: english
7 */
8 #include "icon_intern.h"
9
10 /*****************************************************************************
11
12     NAME */
13 #include <proto/icon.h>
14
15         AROS_LH3(BOOL, AddFreeList,
16
17 /*  SYNOPSIS */
18         AROS_LHA(struct FreeList *, freelist, A0),
19         AROS_LHA(APTR             , mem, A1),
20         AROS_LHA(unsigned long    , size, A2),
21
22 /*  LOCATION */
23         struct IconBase *, IconBase, 12, Icon)
24
25 /*  FUNCTION
26         Adds supplied memory chunk to the supplied freelist. The memory chunk
27         must have been allocated by AllocMem(). All memory added into the
28         freelist can later be deallocated through a single FreeFreeList() call.
29
30     INPUTS
31         freelist - pointer to freelist struct previously allocated by
32             the programmer.
33         mem - memory to add to the freelist.
34         size - size of memory chunk to add to the freelist.
35
36     RESULT
37         FALSE on failure, else TRUE.
38
39     NOTES
40
41     EXAMPLE
42
43     BUGS
44
45     SEE ALSO
46         FreeFreeList()
47
48     INTERNALS
49
50     HISTORY
51
52 *****************************************************************************/
53 {
54     AROS_LIBFUNC_INIT
55
56     struct MemList  *memlist;
57     struct MemEntry *mementry;
58     /* We get hold of the last memlist node inside the list */
59     memlist = (struct MemList*)freelist->fl_MemList.lh_TailPred;
60
61     /* Is this memlist full? */
62     if (freelist->fl_NumFree == 0)
63     {
64         /* No more room, we must allocate a new entry */
65         if (!(memlist = AllocMem (sizeof(struct IconInternalMemList),
66                     MEMF_CLEAR)
67         ) )
68             return FALSE;
69
70         freelist->fl_NumFree = FREELIST_MEMLISTENTRIES;
71         memlist->ml_NumEntries = FREELIST_MEMLISTENTRIES;
72
73         AddTail ((struct List*)&freelist->fl_MemList, (struct Node*)memlist);
74     }
75
76     /* Insert the supplied parameters */
77     mementry = &memlist->ml_ME[freelist->fl_NumFree - 1];
78
79     mementry->me_Un.meu_Addr = mem;
80     mementry->me_Length      = size;
81
82     freelist->fl_NumFree--;
83
84     return TRUE;
85     AROS_LIBFUNC_EXIT
86 } /* AddFreeList */