-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlhthread.c
More file actions
103 lines (88 loc) · 2.57 KB
/
Copy pathlhthread.c
File metadata and controls
103 lines (88 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "lhthread.h"
LHTHREAD *lhthread_new(int id, void *worker) {
LHTHREAD *thread = NULL;
int rc;
char name[255];
thread = malloc (sizeof(LHTHREAD));
if(thread){
thread->id = id;
thread->status = 0;
thread->executar = 1;
thread->proximo = NULL;
rc = pthread_create(&thread->pthread, NULL, worker, (void *) thread);
if (rc){
printf("PTHREAD CREATE ERROR [%d] %s\n", rc, strerror(rc));
lhthread_free(thread);
return NULL;
} else {
memset(name,'\0',255);
sprintf(name,"lhthread-%d",id);
#ifdef __USE_GNU
pthread_setname_np(thread->pthread,name);
#endif
}
}
return thread;
}
LHTHREAD *lhthread_get(LHTHREAD *primeiro, int id){
LHTHREAD *t = NULL;
t = primeiro;
while(t) {
// printf(",%d", t->id);
if(t->id == id){
return t;
}
t = t->proximo;
}
// printf(" NOT FOUND\n"); fflush(stdout);
return NULL;
}
// Retorna o primeiro.
LHTHREAD *lhthread_remove(LHTHREAD *primeiro, int id) {
LHTHREAD *cur, *prior;
cur = primeiro;
prior = NULL;
while(cur){
// se achei o que quero remover.
if(cur->id == id){
// ESTOU NO PRIMEIRO REGISTRO.
if(prior==NULL){
// NAO TENHO UM ANTERIOR, ALTERAR O REGISTRO GLOBAL.
prior = cur->proximo;
lhthread_free(cur);
return prior;
} else {
// FARIA O ANTERIOR APONTAR PRO PROXIMO
prior->proximo = cur->proximo;
lhthread_free(cur);
return primeiro; // NÃO FOI ALTERADO O COMEÇO DA FILA
}
}
prior = cur; // armazena o atual, que sera o anterior.
cur = cur->proximo; // avanca um registro
}
// necessario para caso nao ache a thread.
return primeiro;
}
void lhthread_free(LHTHREAD *thread) {
if(thread){
free(thread);
}
}
void lhthread_join(LHTHREAD *thread) {
if(thread){
pthread_join(thread->pthread, NULL);
}
}
LHTHREAD *lhthread_append(LHTHREAD *primeiro, LHTHREAD *t) {
LHTHREAD *tmp = primeiro;
// Se não iniciou a lista, retorna t;
if(primeiro == NULL) return t;
// Avança até chegar no último registro, onde proximo == NULL
while(tmp->proximo) {
tmp = tmp->proximo;
}
// Armazena T no ultimo registor, e retorna o ponteiro pro primeiro
tmp->proximo = t;
return primeiro;
}