コード例 #1
0
ファイル: u_mm.c プロジェクト: aljen/haiku-opengl
struct mem_block *
u_mmAllocMem(struct mem_block *heap, int size, int align2, int startSearch)
{
   struct mem_block *p;
   const int mask = (1 << align2)-1;
   int startofs = 0;
   int endofs;

   assert(size >= 0);
   assert(align2 >= 0);
   assert(align2 <= 12); /* sanity check, 2^12 (4KB) enough? */

   if (!heap || align2 < 0 || size <= 0)
      return NULL;

   for (p = heap->next_free; p != heap; p = p->next_free) {
      assert(p->free);

      startofs = (p->ofs + mask) & ~mask;
      if ( startofs < startSearch ) {
	 startofs = startSearch;
      }
      endofs = startofs+size;
      if (endofs <= (p->ofs+p->size))
	 break;
   }

   if (p == heap) 
      return NULL;

   assert(p->free);
   p = SliceBlock(p,startofs,size,0,mask+1);

   return p;
}
コード例 #2
0
ファイル: mm.c プロジェクト: BackupTheBerlios/dri-ex-svn
PMemBlock mmAllocMem( memHeap_t *heap, int size, int align2, int startSearch)
{
   int mask,startofs,endofs;
   TMemBlock *p;

   if (!heap || align2 < 0 || size <= 0)
      return NULL;
   mask = (1 << align2)-1;
   startofs = 0;
   p = (TMemBlock *)heap;
   while (p) {
      if ((p)->free) {
	 startofs = (p->ofs + mask) & ~mask;
	 if ( startofs < startSearch ) {
	    startofs = startSearch;
	 }
	 endofs = startofs+size;
	 if (endofs <= (p->ofs+p->size))
	    break;
      }
      p = p->next;
   }
   if (!p)
      return NULL;
   p = SliceBlock(p,startofs,size,0,mask+1);
   p->heap = heap;
   return p;
}
コード例 #3
0
ファイル: mm.c プロジェクト: astrofimov/vgallium
struct mem_block *
mmAllocMem(struct mem_block *heap, unsigned size, unsigned align2, unsigned startSearch)
{
    struct mem_block *p;
    const unsigned mask = (1 << align2)-1;
    unsigned startofs = 0;
    unsigned endofs;

    if (!heap || !align2 || !size)
        return NULL;

    for (p = heap->next_free; p != heap; p = p->next_free) {
        assert(p->free);

        startofs = (p->ofs + mask) & ~mask;
        if ( startofs < startSearch ) {
            startofs = startSearch;
        }
        endofs = startofs+size;
        if (endofs <= (p->ofs+p->size))
            break;
    }

    if (p == heap)
        return NULL;

    assert(p->free);
    p = SliceBlock(p,startofs,size,0,mask+1);

    return p;
}
コード例 #4
0
ファイル: sis_ds.c プロジェクト: JBTech/ralink_rt5350
int mmReserveMem(memHeap_t *heap, int offset,int size)
{
  int endofs;
  TMemBlock *p;

  if (!heap || size <= 0)
    return -1;
  endofs = offset+size;
  p = (TMemBlock *)heap;
  while (p && p->ofs <= offset) {
    if (ISFREE(p) && endofs <= (p->ofs+p->size)) {
      SliceBlock(p,offset,size,1,1);
      return 0;
    }
    p = p->next;
  }
  return -1;
}
コード例 #5
0
struct mem_block *
u_mmAllocMem(struct mem_block *heap, int size, int align2, int startSearch)
{
   struct mem_block *p;
   const int mask = (1 << align2)-1;
   int startofs = 0;
   int endofs;

   assert(size >= 0);
   assert(align2 >= 0);
   /* Make sure that a byte alignment isn't getting passed for our
    * power-of-two alignment arg.
    */
   assert(align2 < 32);

   if (!heap || align2 < 0 || size <= 0)
      return NULL;

   for (p = heap->next_free; p != heap; p = p->next_free) {
      assert(p->free);

      startofs = (p->ofs + mask) & ~mask;
      if ( startofs < startSearch ) {
	 startofs = startSearch;
      }
      endofs = startofs+size;
      if (endofs <= (p->ofs+p->size))
	 break;
   }

   if (p == heap) 
      return NULL;

   assert(p->free);
   p = SliceBlock(p,startofs,size,0,mask+1);

   return p;
}