Example #1
0
/*
 * Set the value in the map at wordPointer to bit.
 */
void
heapMapAtWordPut(void *wordPointer, int bit)
{
	ulong address = (ulong)wordPointer;
	uchar **directory, *page;
	if ((address & ((1<<LOGWORDSIZE)-1)))
		error("misaligned word");
	if (!(directory = mapPages[DIRECTORYINDEX(address)])) {
		if (!(directory = malloc(DIRECTORYSIZE))) {
			perror("heapMap malloc");
			exit(1);
		}
		mapPages[DIRECTORYINDEX(address)] = directory;
		memset(directory,0,DIRECTORYSIZE);
	}
	if (!(page = directory[PAGEINDEX(address)])) {
		if (!(page = malloc(PAGESIZE))) {
			perror("heapMap malloc");
			exit(1);
		}
		directory[PAGEINDEX(address)] = page;
		memset(page,0,PAGESIZE);
	}
	if (bit)
		page[BYTEINDEX(address)] |= 1 << BITINDEX(address);
	else
		page[BYTEINDEX(address)] &= (uchar)-1 ^ (1 << BITINDEX(address));
}
Example #2
0
/*
 * Answer non-zero if the heapMap is set at wordPointer, 0 otherwise
 */
int
heapMapAtWord(void *wordPointer)
{
	ulong address = (ulong)wordPointer;
	uchar *page = mapPages[PAGEINDEX(address)];
	if ((address & ((1<<LOGWORDSIZE)-1)))
		error("misaligned word");
	return page
		? page[BYTEINDEX(address)] & (1 << BITINDEX(address))
		: 0;
}
Example #3
0
/*
 * Answer non-zero if the heapMap is set at wordPointer, 0 otherwise
 */
int
heapMapAtWord(void *wordPointer)
{
	ulong address = (ulong)wordPointer;
	uchar **directory, *page;
	if ((address & ((1<<LOGWORDSIZE)-1)))
		error("misaligned word");
	if (!(directory = mapPages[DIRECTORYINDEX(address)]))
		return 0;
	page = directory[PAGEINDEX(address)];
	return page
		? page[BYTEINDEX(address)] & (1 << BITINDEX(address))
		: 0;
}
Example #4
0
size_t BitSet::oldGetCount(size_t from, size_t to) const {
  if(to >= m_capacity) {
    to = m_capacity;
  }
  if(from > to) {
    return 0;
  }
  size_t fromIndex = BYTEINDEX(from);
  size_t toIndex   = BYTEINDEX(to  );
  const BYTE *p = (const BYTE*)m_p;

  if(fromIndex < toIndex) {
    size_t result;
    if(from % 8) {
      result = setBitsCount[p[fromIndex] & ~_BS_MASKATOM(from%8)];
      fromIndex++;
    } else {
      result = 0;
    }

    if((to+1) % 8) {
      result += setBitsCount[p[toIndex] & _BS_MASKATOM(to%8+1)];
      toIndex--;
    }

    intptr_t j = toIndex - fromIndex + 1;
    if(j > 0) {
      for(p += fromIndex; j--;) {
        result += setBitsCount[*(p++)];
      }
    }
    return result;
  } else {
    return setBitsCount[p[fromIndex] & (~_BS_MASKATOM(from%8) & _BS_MASKATOM(to%8+1))];
  }
}
Example #5
0
intptr_t BitSet::oldGetIndex(size_t i) const {
  if(!contains(i)) {
    return -1;
  }
  const BYTE *p = (const BYTE*)m_p;
  const bool frac = (i%8) ? true : false;
  long result = 0;
  for(size_t j = BYTEINDEX(i)+(frac?1:0); j--;) {
    result += setBitsCount[*(p++)];
   }
  if(frac) {
    p--;
    result -= setBitsCount[*p & ~((1 << (i%8))-1)];
  }
  return result;
}