00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "mmprivate.h"
00023
00024 PTR
00025 mmemalign (md, alignment, size)
00026 PTR md;
00027 size_t alignment;
00028 size_t size;
00029 {
00030 PTR result;
00031 unsigned long int adj;
00032 struct alignlist *l;
00033 struct mdesc *mdp;
00034
00035 if ((result = mmalloc (md, size + alignment - 1)) != NULL)
00036 {
00037 adj = RESIDUAL (result, alignment);
00038 if (adj != 0)
00039 {
00040 mdp = MD_TO_MDP (md);
00041 for (l = mdp -> aligned_blocks; l != NULL; l = l -> next)
00042 {
00043 if (l -> aligned == NULL)
00044 {
00045
00046 break;
00047 }
00048 }
00049 if (l == NULL)
00050 {
00051 l = (struct alignlist *) mmalloc (md, sizeof (struct alignlist));
00052 if (l == NULL)
00053 {
00054 mfree (md, result);
00055 return (NULL);
00056 }
00057 l -> next = mdp -> aligned_blocks;
00058 mdp -> aligned_blocks = l;
00059 }
00060 l -> exact = result;
00061 result = l -> aligned = (char *) result + alignment - adj;
00062 }
00063 }
00064 return (result);
00065 }