Mon 14 Oct 23:06:38 CEST 2024
This commit is contained in:
		
							parent
							
								
									3cfa9290c1
								
							
						
					
					
						commit
						a7cad88073
					
				
							
								
								
									
										119
									
								
								kernel/list.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								kernel/list.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,119 @@ | ||||||
|  | /*
 | ||||||
|  | Copyright (C) 2015-2019 The University of Notre Dame | ||||||
|  | This software is distributed under the GNU General Public License. | ||||||
|  | See the file LICENSE for details. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #include "list.h" | ||||||
|  | 
 | ||||||
|  | void list_push_head(struct list *list, struct list_node *node) | ||||||
|  | { | ||||||
|  | 	node->next = list->head; | ||||||
|  | 	node->prev = 0; | ||||||
|  | 	node->priority = 0; | ||||||
|  | 	if(list->head) | ||||||
|  | 		list->head->prev = node; | ||||||
|  | 	list->head = node; | ||||||
|  | 	if(!list->tail) | ||||||
|  | 		list->tail = node; | ||||||
|  | 	node->list = list; | ||||||
|  | 	list->size++; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void list_push_tail(struct list *list, struct list_node *node) | ||||||
|  | { | ||||||
|  | 	node->prev = list->tail; | ||||||
|  | 	node->next = 0; | ||||||
|  | 	node->priority = 0; | ||||||
|  | 	if(list->tail) | ||||||
|  | 		list->tail->next = node; | ||||||
|  | 	list->tail = node; | ||||||
|  | 	if(!list->head) | ||||||
|  | 		list->head = node; | ||||||
|  | 	node->list = list; | ||||||
|  | 	list->size++; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void list_push_priority(struct list *list, struct list_node *node, int pri) | ||||||
|  | { | ||||||
|  | 	struct list_node *n; | ||||||
|  | 	int i = 0; | ||||||
|  | 	if(!list->head) { | ||||||
|  | 		list_push_head(list, node); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	for(n = list->head; n; n = n->next) { | ||||||
|  | 		if(pri > n->priority || i > 5000) { | ||||||
|  | 			node->next = n; | ||||||
|  | 			node->prev = n->prev; | ||||||
|  | 			node->priority = pri; | ||||||
|  | 			if(n->prev) { | ||||||
|  | 				n->prev->next = node; | ||||||
|  | 			} else { | ||||||
|  | 				list->head = node; | ||||||
|  | 			} | ||||||
|  | 			n->prev = node; | ||||||
|  | 			node->list = list; | ||||||
|  | 			list->size++; | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 		i++; | ||||||
|  | 	} | ||||||
|  | 	list_push_tail(list, node); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct list_node *list_pop_head(struct list *list) | ||||||
|  | { | ||||||
|  | 	struct list_node *result = list->head; | ||||||
|  | 	if(list->head) { | ||||||
|  | 		list->head = list->head->next; | ||||||
|  | 		if(list->head) | ||||||
|  | 			list->head->prev = 0; | ||||||
|  | 		if(!list->head) | ||||||
|  | 			list->tail = 0; | ||||||
|  | 		result->next = result->prev = 0; | ||||||
|  | 		result->list = 0; | ||||||
|  | 		list->size--; | ||||||
|  | 	} | ||||||
|  | 	return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct list_node *list_pop_tail(struct list *list) | ||||||
|  | { | ||||||
|  | 	struct list_node *result = list->tail; | ||||||
|  | 	if(list->tail) { | ||||||
|  | 		list->tail = list->tail->prev; | ||||||
|  | 		if(list->tail) | ||||||
|  | 			list->tail->next = 0; | ||||||
|  | 		if(!list->tail) | ||||||
|  | 			list->head = 0; | ||||||
|  | 		result->next = result->prev = 0; | ||||||
|  | 		result->list = 0; | ||||||
|  | 		list->size--; | ||||||
|  | 	} | ||||||
|  | 	return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void list_remove(struct list_node *node) | ||||||
|  | { | ||||||
|  | 	if(!node->list) | ||||||
|  | 		return; | ||||||
|  | 	if(node->list->head == node) { | ||||||
|  | 		list_pop_head(node->list); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	if(node->list->tail == node) { | ||||||
|  | 		list_pop_tail(node->list); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	node->next->prev = node->prev; | ||||||
|  | 	node->prev->next = node->next; | ||||||
|  | 	node->next = node->prev = 0; | ||||||
|  | 	node->list = 0; | ||||||
|  | 	node->list->size--; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int list_size( struct list *list ) | ||||||
|  | { | ||||||
|  | 	return list->size; | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user