minix/commands/elle/sbvall.c

43 lines
1.5 KiB
C
Raw Normal View History

2005-04-21 16:53:53 +02:00
/* VALLOC - Aligned memory allocator
* Emulation of the 4.2BSD library routine of the same name.
* Copyright 1985 by Ken Harrenstien, SRI International
* This software is quasi-public; it may be used freely with
* like software, but may NOT be sold or made part of licensed
* products without permission of the author. In all cases
* the source code and any modifications thereto must remain
* available to any user.
*
* This is part of the SB library package.
* Any software using the SB library must likewise be made
* quasi-public, with freely available sources.
*/
#include "sb.h"
char *
valloc(size)
unsigned size;
{ register int pagmsk;
register SBMO i;
register struct smblk *sm, *smr;
struct smblk *sbm_mget(), *sbm_split();
pagmsk = getpagesize() - 1; /* Get page size in bytes, less 1 */
if(!(sm = sbm_mget(size+pagmsk, size+pagmsk))) /* Get area big enuf */
return(0);
/* Now find # bytes prior to 1st page boundary.
* This expression gives 0 if already at boundary, else #-1.
*/
i = pagmsk - ((int)(sm->smaddr) & pagmsk);
if(i) /* If need to split off preceding stuff, */
{ smr = sbm_split(sm, i+1); /* do so (note i adjusted) */
sbm_mfree(sm); /* Release preceding mem */
if(!(sm = smr)) return(0); /* If couldn't split, fail */
}
if(i = (sm->smlen - size)) /* See if any trailing stuff */
{ smr = sbm_split(sm, size); /* Yeah, split it off too */
if(smr) sbm_mfree(smr); /* If couldn't split, excess OK. */
}
return((char *)(sm->smaddr));
}