mirror of
https://github.com/Hizenberg469/C1-Linux_SYS_Prog-AS-.git
synced 2026-04-20 02:42:23 +03:00
Linux_sys_prog
This commit is contained in:
81
gluethread/glthreads/glthread.c
Normal file
81
gluethread/glthreads/glthread.c
Normal file
@@ -0,0 +1,81 @@
|
||||
#include "glthread.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/*Private function to add a new_node right after curr_node*/
|
||||
static void
|
||||
_glthread_add_next(glthread_node_t *curr_node,
|
||||
glthread_node_t *new_node){
|
||||
|
||||
if(!curr_node->right){
|
||||
curr_node->right = new_node;
|
||||
new_node->left = curr_node;
|
||||
return;
|
||||
}
|
||||
|
||||
glthread_node_t *temp = curr_node->right;
|
||||
curr_node->right = new_node;
|
||||
new_node->left = curr_node;
|
||||
new_node->right = temp;
|
||||
temp->left = new_node;
|
||||
}
|
||||
|
||||
/*Fn to insert a new GLnode into a glthread at the first position
|
||||
* in a glthread i.e. new node becomes a head
|
||||
* */
|
||||
void
|
||||
glthread_add (glthread_t *lst, glthread_node_t *glnode){
|
||||
|
||||
glnode->left = NULL;
|
||||
glnode->right = NULL;
|
||||
if(!lst->head){
|
||||
lst->head = glnode;
|
||||
return;
|
||||
}
|
||||
glthread_node_t *head = lst->head;
|
||||
_glthread_add_next(glnode, head);
|
||||
lst->head = glnode;
|
||||
}
|
||||
|
||||
static void
|
||||
_remove_glthread(glthread_node_t *glnode){
|
||||
|
||||
if(!glnode->left){
|
||||
if(glnode->right){
|
||||
glnode->right->left = NULL;
|
||||
glnode->right = 0;
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if(!glnode->right){
|
||||
glnode->left->right = NULL;
|
||||
glnode->left = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
glnode->left->right = glnode->right;
|
||||
glnode->right->left = glnode->left;
|
||||
glnode->left = 0;
|
||||
glnode->right = 0;
|
||||
}
|
||||
|
||||
/*API to remove a glnode from glthread*/
|
||||
void
|
||||
glthread_remove(glthread_t *lst, glthread_node_t *glnode){
|
||||
|
||||
glthread_node_t *head = lst->head;
|
||||
/*If the node being removed is the head node itself, then update the
|
||||
* head*/
|
||||
if(head == glnode){
|
||||
lst->head = head->right;
|
||||
}
|
||||
_remove_glthread(glnode);
|
||||
}
|
||||
|
||||
void
|
||||
init_glthread(glthread_t *glthread, unsigned int offset){
|
||||
|
||||
glthread->head = NULL;
|
||||
glthread->offset = offset;
|
||||
}
|
||||
Reference in New Issue
Block a user