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
|
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "base.h"
#include "joblist.h"
#include "log.h"
void joblist_append(server *srv, connection *con) {
if (con->in_joblist) return;
con->in_joblist = 1;
if (srv->joblist->size == 0) {
srv->joblist->size = 16;
srv->joblist->ptr = malloc(sizeof(*srv->joblist->ptr) * srv->joblist->size);
} else if (srv->joblist->used == srv->joblist->size) {
srv->joblist->size += 16;
srv->joblist->ptr = realloc(srv->joblist->ptr, sizeof(*srv->joblist->ptr) * srv->joblist->size);
}
srv->joblist->ptr[srv->joblist->used++] = con;
}
void joblist_free(server *srv, connections *joblist) {
UNUSED(srv);
free(joblist->ptr);
free(joblist);
}
#ifdef USE_GTHREAD
void joblist_async_append(server *srv, connection *con) {
g_async_queue_push(srv->joblist_queue, con);
server_wakeup(srv);
}
void server_wakeup(server *srv) {
if (g_atomic_int_compare_and_exchange(&srv->did_wakeup, 0, 1)) {
write(srv->wakeup_pipe[1], " ", 1);
}
}
#endif
connection *fdwaitqueue_unshift(server *srv, connections *fdwaitqueue) {
connection *con;
UNUSED(srv);
if (fdwaitqueue->used == 0) return NULL;
con = fdwaitqueue->ptr[0];
memmove(fdwaitqueue->ptr, &(fdwaitqueue->ptr[1]), --fdwaitqueue->used * sizeof(*(fdwaitqueue->ptr)));
return con;
}
int fdwaitqueue_append(server *srv, connection *con) {
if (srv->fdwaitqueue->size == 0) {
srv->fdwaitqueue->size = 16;
srv->fdwaitqueue->ptr = malloc(sizeof(*(srv->fdwaitqueue->ptr)) * srv->fdwaitqueue->size);
} else if (srv->fdwaitqueue->used == srv->fdwaitqueue->size) {
srv->fdwaitqueue->size += 16;
srv->fdwaitqueue->ptr = realloc(srv->fdwaitqueue->ptr, sizeof(*(srv->fdwaitqueue->ptr)) * srv->fdwaitqueue->size);
}
srv->fdwaitqueue->ptr[srv->fdwaitqueue->used++] = con;
return 0;
}
void fdwaitqueue_free(server *srv, connections *fdwaitqueue) {
UNUSED(srv);
free(fdwaitqueue->ptr);
free(fdwaitqueue);
}
|