示例#1
0
文件: queue.c 项目: imgits/g-os
void* dequeue(t_queue* queue)
{
	void* datum=0;

	if (!ll_empty(queue))
    	{
		t_llist_node* node=ll_last(queue);
		datum=node->val;
		ll_delete_node(node);	
	}
	return datum;
}
示例#2
0
文件: dllist.c 项目: giumaug/g-os
//IN THIS CASE REMOVE THE LIST'S CONTENT TOO
//BETTER PROVIDE BOTH POSSIBILITY TO DESTROY AND NOT DESTROY 
//THE CONTENT.EXAMPLE WHAT IF THE SAME OBJECT IS INSIDE TWO DIFFERENT
//LISTS? CHECKING C++ LIBRARY CLEAR EMPTY LIST BUT DOESN'T REMOVE
//OBJECT.IDEALLY WE COULD ALLOW FREE ON EMPTY LIST ONLY AND
//DELETAGE ALL FLUSH JOB TO CALLER.THIS IS IMPRACTICAL BECAUSE LEAD 
//TO LOT OF DUPLICATE CODE.
void free_llist(t_llist *l)
{
	t_llist_node* node;
	
  	while (!ll_empty(l)) 
	{
		node=ll_first(l);
		if (l->data_destructor!=NULL)
		{
			(*l->data_destructor)(node->val);
		}
		else 
		{
			kfree(node->val);
		}
    		ll_delete_node(node);
  	}
  	kfree(l->sentinel_node);
  	kfree(l);
}
示例#3
0
文件: unsetenv.c 项目: catuss-a/42sh
static void		_do_unsetenv(t_ll_list *list, char *var_name)
{
  t_ll_node		*w;
  int			i;
  t_var			*var;

  w = list->head;
  i = 0;
  while (i < list->count)
    {
      var = w->data;
      if (!my_strcmp(var_name, var->name))
	{
	  ll_delete_node(list, i + 1,
			 (void (*)(void *))var_free);
	  return ;
	}
      w = w->next;
      i += 1;
    }
}
示例#4
0
文件: ata_bk.c 项目: giumaug/g-os
static unsigned int _read_write_28_ata(t_io_request* io_request)
{
	int i;
	struct t_process_context* process_context;
	struct t_process_context *current_process_context;
	t_device_desc* device_desc;
	t_io_request* pending_request;
	t_llist_node* node;
	
	SAVE_IF_STATUS
	CLI
	exit_count_7++;
	io_request->status=REQUEST_WAITING;
	device_desc=io_request->device_desc;
	if (device_desc->status==REQUEST_WAITING || test==0)
	{
		ll_append(device_desc->pending_request,io_request);
		test=io_request->process_context->pid;
		_sleep();
	}	
	else 
	{
		device_desc->status=REQUEST_WAITING;
	}

	if (io_request->process_context->pid==test)
	{
		i++;
	}

	out(0xE0 | (io_request->lba >> 24),0x1F6);
	out((unsigned char)io_request->sector_count,0x1F2);
	out((unsigned char)io_request->lba,0x1F3);
	out((unsigned char)(io_request->lba >> 8),0x1F4);
	out((unsigned char)(io_request->lba >> 16),0x1F5);
	out(io_request->command,0x1F7);

	if (io_request->command==WRITE_28)
	{
		for (i=0;i<256;i++)
		{  
			//out(*(char*)io_request->io_buffer++,0x1F0); 
			outw((unsigned short)57,0x1F0);
		}
	}
	system.device_desc->serving_request=io_request;
	if (system.process_info.current_process->val!=NULL)
	{
		io_request->process_context=system.process_info.current_process->val;
		_sleep();
	}
	else
	{
		while(io_request->status==REQUEST_WAITING);
	}

	if (io_request->process_context->pid==test)
	{
		i++;
	}


	if (io_request->status!=REQUEST_COMPLETED)
	{
		panic();
		return -1;
	}

	if (io_request->command==READ_28)
	{
		for (i=0;i<256;i++)
		{  
			//out(*(char*)io_buffer++,0x1F0); 
			int zz=inw(0x1F0);
			((char*)io_request->io_buffer)[i]=zz;
		}
	}

	if (!ll_empty(device_desc->pending_request))
	{
		node=ll_first(device_desc->pending_request);
		pending_request=(t_io_request*) node->val;
		ll_delete_node(node);
		_awake(pending_request->process_context);
	}
	RESTORE_IF_STATUS
	return 0;
}
示例#5
0
void tcp_conn_map_remove(t_tcp_conn_map* tcp_conn_map,u16 src_ip,u16 dst_ip,u32 src_ip,u32 dst_ip)
{
	u32 conn_id;
	t_tcp_conn_desc* tcp_conn_desc = NULL;
	t_tcp_conn_desc* next_tcp_conn_desc = NULL;
	t_llist_node* sentinel_node = NULL;
	t_llist_node* next = NULL;
	u32 count = 0;
	
	conn_id = dst_port | (src_port << 16);
	tcp_conn_desc = hashtable_get(tcp_conn_map->conn_map,conn_id);

	if (tcp_conn_desc == NULL)
	{
		return;
	}
	if (tcp_conn_desc->is_key_unique == 0)
	{
		hashtable_remove(tcp_conn_map->conn_map,conn_id);
		return;
	}
	else if (tcp_conn_desc->src_ip == src_ip && tcp_conn_desc->dst_ip == dst_ip && tcp_conn_desc->src_port == src_port && tcp_conn_desc->dst_port == dst_port)
	{
		sentinel_node = ll_sentinel(tcp_conn_map->duplicate_conn_list);
		next=ll_first(tcp_conn_map->duplicate_conn_list);
		while(next != sentinel_node)
		{
			next_tcp_conn_desc = next->val;
			if (next_tcp_conn_desc->conn_id == conn_id)
			{
				count++;
			}
			if (count == 1)
			{
				remove_node = next;
			}
		}
		if (count == 1)
		{
			remove_node->val->is_unique_key = 0;
		}
		hashtable_remove(tcp_conn_map->conn_map,conn_id);
		hashtable_put(tcp_conn_map->conn_map,conn_id,remove_node->val);
		ll_delete_node(remove_node);	
	}
	else 
	{
		sentinel_node = ll_sentinel(tcp_conn_map->duplicate_conn_list);
		next = ll_first(tcp_conn_map->duplicate_conn_list);
		while(next != sentinel_node)
		{
			next_tcp_conn_desc = next->val;
			if (next_tcp_conn_desc->src_ip == src_ip && 
			    next_tcp_conn_desc->dst_ip == dst_ip && 
			    next_tcp_conn_desc->src_port == src_port && 
			    next_tcp_conn_desc->dst_port == dst_port)
			{
				remove_node = next;
			}

			if (next_tcp_conn_desc->conn_id == conn_id)
			{
				count++;
			}
		}
		ll_delete_node(remove_node);
		if (count == 1)
		{
			tcp_conn_desc->is_key_unique == 0
		}
	}
}