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; }
//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); }
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; } }
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; }
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 } } }