Skip to content

Commit 989a4a3

Browse files
committed
hash table improve performance and fixup bugs
1 parent d9afe10 commit 989a4a3

File tree

2 files changed

+44
-26
lines changed

2 files changed

+44
-26
lines changed

respawn.c

Lines changed: 43 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,20 @@
1515
#define RESPAWN_FILE "/etc/ueld/respawn.list"
1616
#define HASHTABLE_FIRST_NODE_SIZE 32
1717

18+
#ifdef __GNUC__
19+
#define likely(x) __builtin_expect((x),1)
20+
#define unlikely(x) __builtin_expect((x),0)
21+
#else
22+
#define likely(x) (x)
23+
#define unlikely(x) (x)
24+
#endif /* __GNUC__ */
25+
1826
struct respawn_node {
1927
int nref;
2028
int vt;
2129
pid_t pid;
2230
char *cmd;
31+
struct respawn_node *prev;
2332
struct respawn_node *next;
2433
};
2534

@@ -33,14 +42,6 @@ static char *respawn;
3342
#define nodefree(node) (free(node))
3443
#define noderef(node) (((node)->nref)++)
3544

36-
#ifdef __GNUC__
37-
#define likely(x) __builtin_expect((x),1)
38-
#define unlikely(x) __builtin_expect((x),0)
39-
#else
40-
#define likely(x) (x)
41-
#define unlikely(x) (x)
42-
#endif /* __GNUC__ */
43-
4445
static struct respawn_node *nodenew()
4546
{
4647
static struct respawn_node *node;
@@ -66,6 +67,7 @@ static void insert(pid_t key, struct respawn_node *node)
6667
int index = hashpid(key);
6768

6869
noderef(node);
70+
node->prev = NULL;
6971
node->next = NULL;
7072

7173
if (first_nodes[index] == NULL) {
@@ -76,6 +78,7 @@ static void insert(pid_t key, struct respawn_node *node)
7678
prenode = prenode->next;
7779
}
7880
prenode->next = node;
81+
node->prev = prenode;
7982
}
8083
}
8184

@@ -95,29 +98,42 @@ static struct respawn_node *get(pid_t key)
9598
return NULL;
9699
}
97100

101+
#define delete_node_without_index(node) delete_node((node), -1)
102+
103+
static void delete_node(struct respawn_node *node, int index)
104+
{
105+
struct respawn_node *prenode = node->prev;
106+
107+
if (prenode) {
108+
prenode->next = node->next;
109+
} else {
110+
if (index == -1)
111+
index = hashpid(node->pid);
112+
first_nodes[index] = node->next;
113+
}
114+
115+
if (node->next) {
116+
node->next->prev = prenode;
117+
}
118+
119+
nodeunref(node);
120+
}
121+
98122
static void delete(pid_t key)
99123
{
100124
int index = hashpid(key);
101125

102-
struct respawn_node *prenode = NULL;
103126
struct respawn_node *node = first_nodes[index];
104127
while (node != NULL) {
105128
if (node->pid == key) {
106-
if (prenode) {
107-
prenode->next = node->next;
108-
} else {
109-
first_nodes[index] = node->next;
110-
}
111-
112-
nodeunref(node);
129+
delete_node(node, index);
113130
}
114131

115-
prenode = node;
116132
node = node->next;
117133
}
118134
}
119135

120-
static pid_t runapp(struct respawn_node* app)
136+
static pid_t runapp(struct respawn_node *app)
121137
{
122138
pid_t pid;
123139

@@ -127,8 +143,8 @@ static pid_t runapp(struct respawn_node* app)
127143
pid = ueld_run(app->cmd, URF_CMDLINE, 0, NULL);
128144
}
129145

130-
if (pid < 0) pid = 0;
131-
app->pid = pid;
146+
if (pid < 0)
147+
pid = 0;
132148

133149
return pid;
134150
}
@@ -171,12 +187,13 @@ void respawn_init()
171187
struct respawn_node *node;
172188
if ((node = nodenew()) != NULL) {
173189
node->vt = atoi(vt);
174-
node->pid = 0;
175190
node->cmd = cmd;
176191

177192
pid_t pid = runapp(node);
178193

179-
if (unlikely(pid <= 0)) {
194+
node->pid = pid;
195+
196+
if (unlikely(pid == 0)) {
180197
ueld_print("Run respwan process '%s' first time failed\n", cmd);
181198
} else {
182199
appssz++;
@@ -203,12 +220,12 @@ void respawnpid(pid_t pid)
203220
if ((node = get(pid)) != NULL) {
204221
pid_t newpid = runapp(node);
205222

206-
if (unlikely(newpid <= 0)) {
223+
if (unlikely(newpid == 0)) {
207224
ueld_print("Respwan process '%s' failed, remove it from list...\n", node->cmd);
208-
delete(node->pid);
225+
delete_node_without_index(node);
209226
} else {
210227
noderef(node);
211-
delete(node->pid);
228+
delete_node_without_index(node);
212229
node->pid = newpid;
213230
insert(newpid, node);
214231
nodeunref(node);
@@ -234,5 +251,6 @@ void clearpid(pid_t pid)
234251
first_nodes[i] = NULL;
235252
}
236253
}
254+
munmap(respawn, length);
237255
}
238256
}

version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.6.0-unstable
1+
0.6.1-unstable

0 commit comments

Comments
 (0)