Пример #1
0
BOOL8	pmt_cache_evict()
{
	if (!pmt_cache_is_full()) return 0;

	while (merge_buf_size < SUB_PAGES_PER_PAGE) {
		UINT32 lru_page_idx = mem_search_min_max(
						 cached_pmt_timestamps,
						 sizeof(UINT32),
						 NUM_PC_SUB_PAGES,
						 MU_CMD_SEARCH_MIN_SRAM);
		ASSERT(lru_page_idx < NUM_PC_SUB_PAGES);
		ASSERT(cached_pmt_idxes[lru_page_idx] < PMT_SUB_PAGES);
		ASSERT(cached_pmt_timestamps[lru_page_idx] < NULL_TIMESTAMP);

		BOOL8 is_dirty = bit_array_test(cached_pmt_is_dirty, lru_page_idx);
		if (!is_dirty) {
			free_page(lru_page_idx);
			return 0;
		}

		if (lru_page_idx == last_page_idx) {
			last_page_idx = NULL_PAGE_IDX;
			last_pmt_idx = NULL_PMT_IDX;
		}

		cached_pmt_timestamps[lru_page_idx] = EVICTED_TIMESTAMP;
		merged_page_idxes[merge_buf_size] = lru_page_idx;
		merge_buf_size++;
	}
	return 1;
}
Пример #2
0
static void dma_si_write(struct si_controller* si)
{
    int i;

    if (si->regs[SI_PIF_ADDR_WR64B_REG] != 0x1FC007C0)
    {
        DebugMessage(si->r4300->state, M64MSG_ERROR, "dma_si_write(): unknown SI use");
        si->r4300->state->stop=1;
    }

    for (i = 0; i < PIF_RAM_SIZE; i += 4)
    {
        *((uint32_t*)(&si->pif.ram[i])) = sl(si->ri->rdram.dram[(si->regs[SI_DRAM_ADDR_REG]+i)/4]);
    }
    
    if (si->r4300->state->enable_trimming_mode)
    {
        for (i = 0; i < PIF_RAM_SIZE; i += 4)
        {
            unsigned int ram_address = si->regs[SI_DRAM_ADDR_REG] + i;
            if (!bit_array_test(si->r4300->state->barray_ram_written_first, ram_address / 4))
                bit_array_set(si->r4300->state->barray_ram_read, ram_address / 4);
        }
    }

    update_pif_write(si);
    update_count(si->r4300->state);

    if (si->r4300->state->g_delay_si) {
        add_interupt_event(si->r4300->state, SI_INT, /*0x100*/0x900);
    } else {
        si->regs[SI_STATUS_REG] |= 0x1000; // INTERRUPT
        signal_rcp_interrupt(si->r4300, MI_INTR_SI);
    }
}
Пример #3
0
int create_block_reservation(int blocks_needed) {
  // Finds an area of free blocks in our database file.

  int i,j;
  bool found = false;
  int retval = -1;

  sem_wait(BLOCK_BITMAP_LOCK);

  for (j = 0; j < MAX_BLOCKS; j++) {
    for (i = 0; i < blocks_needed; i++) { 
      if (bit_array_test(SHM_BLOCK_BITMAP, i + j) != 0) {// didn't find a contiguous block
        j += i;
        break; 
      }
    }
    if (i == blocks_needed) {
      found = true;
      break;
    }
  }

  if (found) {
    for (i = 0; i < blocks_needed; i++) // Found a good set of blocks. Mark them as used.
      bit_array_set(SHM_BLOCK_BITMAP, i + j);
    retval = j;
  }

  msync(SHM_BLOCK_BITMAP, BLOCK_BITMAP_BYTES, MS_SYNC); // commit the whole block bitmap to disk

  sem_post(BLOCK_BITMAP_LOCK);

  return(retval);
}
Пример #4
0
BOOL8	pmt_cache_is_dirty(UINT32 const pmt_idx)
{
	UINT32	page_idx = get_page(pmt_idx);
	ASSERT(page_idx != NULL_PAGE_IDX);

	BOOL8 is_dirty = bit_array_test(cached_pmt_is_dirty, page_idx);
	return is_dirty;
}
Пример #5
0
void hash_write_lock(int hash_number) {
  while (1) {
    sem_wait(HASHBUCKET_LOCK);
    if ((bit_array_test(SHM_HASHBUCKET_BITMAP, hash_number)) == 0) {
      bit_array_set(SHM_HASHBUCKET_BITMAP, hash_number);
      sem_post(HASHBUCKET_LOCK);
      break;
    }
    sem_post(HASHBUCKET_LOCK);
  }
}
Пример #6
0
void* socketHandler(struct SHArgs *shargs) {
  int *clientSocket = shargs->clientSocket;
  bit_array_t *bits = shargs->bits;

  int packetLen = 5;
  int byteCount;

  struct message msg;
  struct message rsp;

  char read_char = 'r';
  char set_char = 's';
  char unset_char = 'u';
  char error_char = 'e';


  while ((byteCount = recv(*clientSocket, &msg, 5, 0)) > 0) {

    /* printf("got data\n"); */

    rsp.offset = msg.offset;
    rsp.val = error_char;

    if (msg.val == read_char) {
      /* printf("read\n"); */
      if(bit_array_test(bits, msg.offset)) {
        rsp.val = set_char;
      } else {
        rsp.val = unset_char;
      }
    } else if (msg.val == set_char){
      /* printf("set\n"); */
      bit_array_set_true(bits, msg.offset);
      rsp.val = set_char;
    } else if (msg.val == unset_char) {
      /* printf("unset\n"); */
      bit_array_set_false(bits, msg.offset);
      rsp.val = unset_char;
    } else {
      /* printf("recieved malformed action.\n"); */
    }

    send(*clientSocket, &rsp, packetLen, 0);
  }
  shutdown(*clientSocket, SHUT_WR);
  close(*clientSocket);

  free(clientSocket);
  printf("Lost a connection.\n");
  return NULL;
}
Пример #7
0
void keydb_lock(int64_t pos) {

  char key[1024] = "";
  int hash_number;

  sprintf(key, "%llu", pos); // turn pos into a string.
  hash_number = get_hash_val(10, key); // 2^10 = 1024. See SHM_KEYDB_BITMAP.

  while (1) {
    sem_wait(KEYDB_LOCK);
    if ((bit_array_test(SHM_KEYDB_BITMAP, hash_number)) == 0) {
      bit_array_set(SHM_KEYDB_BITMAP, hash_number);
      sem_post(KEYDB_LOCK);
      break;
    }
    sem_post(KEYDB_LOCK);
  }

}