This commit is contained in:
2024-03-10 12:28:24 +05:30
commit 60786b94e2
6 changed files with 485 additions and 0 deletions

1
glthread/cleaner.sh Normal file
View File

@@ -0,0 +1 @@
rm *~ .*

196
glthread/glthread.c Normal file
View File

@@ -0,0 +1,196 @@
/*
* =====================================================================================
*
* Filename: glthread.c
*
* Description:
*
* Version: 1.0
* Created: 09/03/24 07:31:52 PM IST
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
#include "glthread.h"
#include <stdlib.h>
void
init_glthread(glthread_t *glthread){
glthread->left = NULL;
glthread->right = NULL;
}
void
glthread_add_next(glthread_t *curr_glthread, glthread_t *new_glthread){
if(!curr_glthread->right){
curr_glthread->right = new_glthread;
new_glthread->left = curr_glthread;
return;
}
glthread_t *temp = curr_glthread->right;
curr_glthread->right = new_glthread;
new_glthread->left = curr_glthread;
new_glthread->right = temp;
temp->left = new_glthread;
}
void
glthread_add_before(glthread_t *curr_glthread, glthread_t *new_glthread){
if(!curr_glthread->left){
new_glthread->left = NULL;
new_glthread->right = curr_glthread;
curr_glthread->left = new_glthread;
return;
}
glthread_t *temp = curr_glthread->left;
temp->right = new_glthread;
new_glthread->left = temp;
new_glthread->right = curr_glthread;
curr_glthread->left = new_glthread;
}
void
remove_glthread(glthread_t *curr_glthread){
if(!curr_glthread->left){
if(curr_glthread->right){
curr_glthread->right->left = NULL;
curr_glthread->right = 0;
return;
}
return;
}
if(!curr_glthread->right){
curr_glthread->left->right = NULL;
curr_glthread->left = NULL;
return;
}
curr_glthread->left->right = curr_glthread->right;
curr_glthread->right->left = curr_glthread->left;
curr_glthread->left = 0;
curr_glthread->right = 0;
}
void
delete_glthread_list(glthread_t *glthread_head){
glthread_t *glthreadptr = NULL;
ITERATE_GLTHREAD_BEGIN(glthread_head, glthreadptr){
remove_glthread(glthreadptr);
} ITERATE_GLTHREAD_END(glthread_head, glthreadptr);
}
void
glthread_add_last(glthread_t *glthread_head, glthread_t *new_glthread){
glthread_t *glthreadptr = NULL,
*prevglthreadptr = NULL;
ITERATE_GLTHREAD_BEGIN(glthread_head, glthreadptr){
prevglthreadptr = glthreadptr;
} ITERATE_GLTHREAD_END(glthread_head, glthreadptr);
if(prevglthreadptr)
glthread_add_next(prevglthreadptr, new_glthread);
else
glthread_add_next(glthread_head, new_glthread);
}
unsigned int
get_glthread_list_count(glthread_t *glthread_head){
unsigned int count = 0;
glthread_t *glthreadptr = NULL;
ITERATE_GLTHREAD_BEGIN(glthread_head, glthreadptr){
count++;
} ITERATE_GLTHREAD_END(glthread_head, glthreadptr);
return count;
}
void
glthread_priority_insert(glthread_t *glthread_head,
glthread_t *glthread,
int (*comp_fn)(void *, void *),
int offset){
glthread_t *curr = NULL,
*prev = NULL;
init_glthread(glthread);
if(IS_GLTHREAD_LIST_EMPTY(glthread_head)){
glthread_add_next(glthread_head, glthread);
return;
}
/* Only one node*/
if(glthread_head->right && !glthread_head->right->right){
if(comp_fn(GLTHREAD_GET_USER_DATA_FROM_OFFSET(glthread, offset),
GLTHREAD_GET_USER_DATA_FROM_OFFSET(glthread_head->right, offset)) == -1){
glthread_add_next(glthread_head, glthread);
}
else{
glthread_add_next(glthread_head->right, glthread);
}
return;
}
ITERATE_GLTHREAD_BEGIN(glthread_head, curr){
if(comp_fn(GLTHREAD_GET_USER_DATA_FROM_OFFSET(glthread, offset),
GLTHREAD_GET_USER_DATA_FROM_OFFSET(curr, offset)) != -1){
prev = curr;
continue;
}
if(!prev)
glthread_add_next(glthread_head, glthread);
else
glthread_add_next(prev, glthread);
return;
}ITERATE_GLTHREAD_END(glthread_head, curr);
/*Add in the end*/
glthread_add_next(prev, glthread);
}
glthread_t *
dequeue_glthread_first(glthread_t *base_glthread){
glthread_t *temp;
if(!base_glthread->right)
return NULL;
temp = base_glthread->right;
remove_glthread(temp);
return temp;
}
#if 0
void *
gl_thread_search(glthread_t *glthread_head,
void *(*thread_to_struct_fn)(glthread_t *),
void *key,
int (*comparison_fn)(void *, void *)){
return NULL;
}
#endif

95
glthread/glthread.h Normal file
View File

@@ -0,0 +1,95 @@
/*
* =====================================================================================
*
* Filename: glthread.h
*
* Description:
*
* Version: 1.0
* Created: 09/03/24 07:30:40 PM IST
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Organization:
*
* =====================================================================================
*/
#ifndef __GLUETHREAD__
#define __GLUETHREAD__
typedef struct _glthread{
struct _glthread *left;
struct _glthread *right;
} glthread_t;
void
glthread_add_next(glthread_t *base_glthread, glthread_t *new_glthread);
void
glthread_add_before(glthread_t *base_glthread, glthread_t *new_glthread);
void
remove_glthread(glthread_t *glthread);
void
init_glthread(glthread_t *glthread);
void
glthread_add_last(glthread_t *base_glthread, glthread_t *new_glthread);
#define IS_GLTHREAD_LIST_EMPTY(glthreadptr) \
((glthreadptr)->right == 0 && (glthreadptr)->left == 0)
#define GLTHREAD_TO_STRUCT(fn_name, structure_name, field_name,glthreadptr) \
static inline structure_name * fn_name(glthread_t *glthreadptr){ \
if(glthreadptr)\
return (structure_name *)((char *)(glthreadptr) - (char *)&(((structure_name *)0)->field_name)); \
else return NULL;\
}
/* delete safe loop*/
/*Normal continue and break can be used with this loop macro*/
#define BASE(glthreadptr) ((glthreadptr)->right)
#define ITERATE_GLTHREAD_BEGIN(glthreadptrstart, glthreadptr) \
{ \
glthread_t *_glthread_ptr = NULL; \
glthreadptr = BASE(glthreadptrstart); \
for(; glthreadptr!= NULL; glthreadptr = _glthread_ptr){ \
_glthread_ptr = (glthreadptr)->right;
#define ITERATE_GLTHREAD_END(glthreadptrstart, glthreadptr) \
}}
#define GLTHREAD_GET_USER_DATA_FROM_OFFSET(glthreadptr, offset) \
(void *)((char *)(glthreadptr) - offset)
void
delete_glthread_list(glthread_t *base_glthread);
unsigned int
get_glthread_list_count(glthread_t *base_glthread);
void
glthread_priority_insert(glthread_t *base_glthread,
glthread_t *glthread,
int (*comp_fn)(void *, void *),
int offset);
glthread_t *
dequeue_glthread_first(glthread_t *base_glthread);
#if 0
void *
gl_thread_search(glthread_t *base_glthread,
void *(*thread_to_struct_fn)(glthread_t *),
void *key,
int (*comparison_fn)(void *, void *));
#endif
#endif /* __GLUETHREAD__ */