Example #1
0
int Cache::get_data(const int index, Qfloat **data, int len)
{
	head_t *h = &head[index];
	if(h->len) lru_delete(h);
	int more = len - h->len;

	if(more > 0)
	{
		// free old space
		while(size < more)
		{
			head_t *old = lru_head.next;
			lru_delete(old);
			free(old->data);
			size += old->len;
			old->data = 0;
			old->len = 0;
		}

		// allocate new space
		h->data = (Qfloat *)realloc(h->data,sizeof(Qfloat)*len);
		size -= more;
		swap(h->len,len);
	}

	lru_insert(h);
	*data = h->data;
	return len;
}
Example #2
0
void Cache::swap_index(int i, int j)
{
	if(i==j) return;

	if(head[i].len) lru_delete(&head[i]);
	if(head[j].len) lru_delete(&head[j]);
	swap(head[i].data,head[j].data);
	swap(head[i].len,head[j].len);
	if(head[i].len) lru_insert(&head[i]);
	if(head[j].len) lru_insert(&head[j]);

	if(i>j) swap(i,j);
	for(head_t *h = lru_head.next; h!=&lru_head; h=h->next)
	{
		if(h->len > i)
		{
			if(h->len > j)
				swap(h->data[i],h->data[j]);
			else
			{
				// give up
				lru_delete(h);
				free(h->data);
				size += h->len;
				h->data = 0;
				h->len = 0;
			}
		}
	}
}
Example #3
0
Qfloat* sCache::get_data(int idx,  int len, int& numRet)
{	
	shead_t *h = &head[idx];
	h->refcount ++;

	if(h->len > 0) lru_delete(h);
	if(len > h->max_len)
	{
		int more   = len + CACHE_DELTA - h->max_len;
		h->max_len = h->max_len + more;
		int count = 0;
		// free old space
		while(maxItem < more) //requested space exceeds logical limit
		{
			count++;
			shead_t *old = lru_head.next;
			lru_delete(old);		
			free(old->data);
			old->data    = NULL;
			maxItem     += old->max_len;				
			old->len     = 0;	
			old->max_len = 0;
		}

		// allocate new space
		h->data = (Qfloat *)realloc(h->data,sizeof(Qfloat)*h->max_len);
		
		if (h->data == NULL)//requested space cannot be provided by physical limit
		{	
			while(h->data == NULL && lru_head.next != &lru_head)
			{
				shead_t *old = lru_head.next;
				lru_delete(old);

				if (old->refcount <= 0)
				{
					free(old->data);
					old->data    = NULL;
					maxItem     += old->max_len;				
					old->len     = 0;	
					old->max_len = 0;
					h->data = (Qfloat *)calloc(h->max_len,sizeof(Qfloat));
				}
				else
				{
					old->refcount --;
					lru_insert(old);
				}
			}
			h->len  = 0;
			if (h->data == NULL)
			{
				printf ("sCache cannot allocate memory!\n");
				return NULL;
			}
		}
		maxItem -= more;		
	}

	lru_insert(h);
	numRet = h->len;
	h->len = len;
	return h->data;
}
Example #4
0
/****************************** LOCAL FUNCTIONS *******************************/
int main ()
{
   int32_t i_ret_val = -1;
   PAL_RET_E e_pal_ret = ePAL_RET_FAILURE;
   bool b_pal_init = false;
   PAL_LOGGER_INIT_PARAMS_X x_logger_param = { false };
   LRU_RET_E e_lru_ret = eLRU_RET_FAILURE;
   LRU_HDL hl_lru_hdl = NULL;
   LRU_INIT_PARAMS_X x_lru_init_params = {0};
   LRU_NODE_DATA_X x_node_data = {eHM_KEY_TYPE_INVALID};
   uint8_t uca_str_buf[1024] = {0};
   int i_command = -1;
   int i_ret = -1;
   bool b_exit = false;

   x_logger_param.b_enable_console_logging = true;
   x_logger_param.e_level = eLOG_LEVEL_HIGH;
   pal_logger_env_init (&x_logger_param);

   e_pal_ret = pal_env_init ();
   if (ePAL_RET_SUCCESS != e_pal_ret)
   {
      LRU_TEST_LOG ("pal_env_init failed: %d", e_pal_ret);
      goto CLEAN_RETURN;
   }
   b_pal_init = true;
   LRU_TEST_LOG ("pal_env_init success");

   x_lru_init_params.ui_max_size_bytes = (1 * 1024 * 1024);
   e_lru_ret = lru_init(&hl_lru_hdl, &x_lru_init_params);
   if ((eLRU_RET_SUCCESS != e_lru_ret) || (NULL == hl_lru_hdl)) {
      LRU_TEST_LOG ("lru_create failed: %d, %p", e_lru_ret, hl_lru_hdl);
      goto CLEAN_RETURN;
   }
   LRU_TEST_LOG ("lru_create success: %d, %p", e_lru_ret, hl_lru_hdl);




   while (1)
   {
      printf ("Commands:\n\t1. Add\n\t2. Search\n\t3. Delete"
               "\n\t4. Delete All\n\t5. Exit\n"
               "Enter Command: ");
      fflush (stdout);

      PAL_GET_INT32_FROM_CONSOLE(&i_command);

      if (4 != i_command && 5 != i_command && 6 != i_command)
      {
         printf ("Enter String: "); fflush (stdout);

         PAL_GET_STRING_FROM_CONSOLE(uca_str_buf, sizeof(uca_str_buf));
      }

      switch (i_command)
      {
         case 1:
         {
            (void) pal_memset(&x_node_data, 0x00, sizeof(x_node_data));
            x_node_data.x_hm_node.e_hm_key_type = eHM_KEY_TYPE_STRING;
            x_node_data.x_hm_node.u_hm_key.puc_str_key = uca_str_buf;
            x_node_data.x_hm_node.p_data = malloc (100);
            x_node_data.x_hm_node.ui_data_size = 100;
            e_lru_ret = lru_set (hl_lru_hdl, &x_node_data);
            if (eLRU_RET_SUCCESS != e_lru_ret) {
               LRU_TEST_LOG ("lru_set failed: %d, %p", e_lru_ret, hl_lru_hdl);
            }
            else {
               LRU_TEST_LOG ("lru_set success: %d, %p", e_lru_ret, hl_lru_hdl);
               lru_print (hl_lru_hdl);
            }
            break;
         }
         case 2:
         {
            (void) pal_memset(&x_node_data, 0x00, sizeof(x_node_data));
            x_node_data.x_hm_node.e_hm_key_type = eHM_KEY_TYPE_STRING;
            x_node_data.x_hm_node.u_hm_key.puc_str_key = uca_str_buf;
            e_lru_ret = lru_has (hl_lru_hdl, &x_node_data);
            if (eLRU_RET_NODE_FOUND == e_lru_ret)
            {
               LRU_TEST_LOG("Key \"%s\" Found: %p", uca_str_buf, x_node_data.x_hm_node.p_data);
            }
            else
            {
               LRU_TEST_LOG("Key \"%s\" Not Found: %d", uca_str_buf, e_lru_ret);
            }
            break;
         }
         case 3:
         {
            (void) pal_memset(&x_node_data, 0x00, sizeof(x_node_data));
            x_node_data.x_hm_node.e_hm_key_type = eHM_KEY_TYPE_STRING;
            x_node_data.x_hm_node.u_hm_key.puc_str_key = uca_str_buf;
            e_lru_ret = lru_delete (hl_lru_hdl, &x_node_data);
            if (eLRU_RET_SUCCESS == e_lru_ret)
            {
               LRU_TEST_LOG("Key \"%s\" Deleted", uca_str_buf);
            }
            else
            {
               LRU_TEST_LOG("Key \"%s\" Not Found: %d", uca_str_buf, e_lru_ret);
            }

            lru_print (hl_lru_hdl);
            break;
         }
         case 4:
         {
            e_lru_ret = lru_delete_all (hl_lru_hdl);
            lru_print (hl_lru_hdl);
          break;
         }
         case 5:
         {
            b_exit = true;
            break;
         }
      }
      if (true == b_exit)
      {
         break;
      }
   }




CLEAN_RETURN:
   if (NULL != hl_lru_hdl) {
      lru_deinit(hl_lru_hdl);
   }
   if (true == b_pal_init)
   {
      e_pal_ret = pal_env_deinit();
      if (ePAL_RET_SUCCESS != e_pal_ret)
      {
         LRU_TEST_LOG("pal_env_deinit failed: %d", e_pal_ret);
      }
      else
      {
         LRU_TEST_LOG("pal_env_deinit success");
      }
   }
   return i_ret_val;
}