45 lines
1.3 KiB
C
45 lines
1.3 KiB
C
|
/****************************************************************
|
||
|
* *
|
||
|
* Copyright 2001 Sanchez Computer Associates, Inc. *
|
||
|
* *
|
||
|
* This source code contains the intellectual property *
|
||
|
* of its copyright holder(s), and is made available *
|
||
|
* under a license. If you do not know the terms of *
|
||
|
* the license, please stop and do not read further. *
|
||
|
* *
|
||
|
****************************************************************/
|
||
|
|
||
|
#include "mdef.h"
|
||
|
#include "gdsroot.h"
|
||
|
#include "gdsblk.h"
|
||
|
#include "gdsbml.h"
|
||
|
#include "min_max.h"
|
||
|
#include "gtm_ffs.h"
|
||
|
#include "bmm_find_free.h"
|
||
|
|
||
|
#define MAX_FFS_SIZE 32
|
||
|
|
||
|
/* Returns the location of the first set bit in the field. */
|
||
|
/* The search starts at the hint and wraps if necessary. */
|
||
|
|
||
|
int4 bmm_find_free(uint4 hint, uchar_ptr_t base_addr, uint4 total_bits)
|
||
|
{
|
||
|
int4 answer, width;
|
||
|
uint4 start, top;
|
||
|
|
||
|
if (hint >= total_bits)
|
||
|
hint = 0;
|
||
|
for (start = hint, top = total_bits; top; start = 0, top = hint, hint = 0)
|
||
|
{ /* one or two passes through outer loop; second is a wrap to the beginning */
|
||
|
for (width = MIN(top, ROUND_DOWN2(start, MAX_FFS_SIZE) + MAX_FFS_SIZE) - start; width > 0;
|
||
|
start += width, width = MIN(top - start, MAX_FFS_SIZE))
|
||
|
{
|
||
|
answer = gtm_ffs(start, base_addr, width);
|
||
|
if (NO_FREE_SPACE != answer)
|
||
|
return answer;
|
||
|
}
|
||
|
}
|
||
|
assert(NO_FREE_SPACE == answer);
|
||
|
return NO_FREE_SPACE;
|
||
|
}
|