15
15
#define RESPAWN_FILE "/etc/ueld/respawn.list"
16
16
#define HASHTABLE_FIRST_NODE_SIZE 32
17
17
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
+
18
26
struct respawn_node {
19
27
int nref ;
20
28
int vt ;
21
29
pid_t pid ;
22
30
char * cmd ;
31
+ struct respawn_node * prev ;
23
32
struct respawn_node * next ;
24
33
};
25
34
@@ -33,14 +42,6 @@ static char *respawn;
33
42
#define nodefree (node ) (free(node))
34
43
#define noderef (node ) (((node)->nref)++)
35
44
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
-
44
45
static struct respawn_node * nodenew ()
45
46
{
46
47
static struct respawn_node * node ;
@@ -66,6 +67,7 @@ static void insert(pid_t key, struct respawn_node *node)
66
67
int index = hashpid (key );
67
68
68
69
noderef (node );
70
+ node -> prev = NULL ;
69
71
node -> next = NULL ;
70
72
71
73
if (first_nodes [index ] == NULL ) {
@@ -76,6 +78,7 @@ static void insert(pid_t key, struct respawn_node *node)
76
78
prenode = prenode -> next ;
77
79
}
78
80
prenode -> next = node ;
81
+ node -> prev = prenode ;
79
82
}
80
83
}
81
84
@@ -95,29 +98,42 @@ static struct respawn_node *get(pid_t key)
95
98
return NULL ;
96
99
}
97
100
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
+
98
122
static void delete (pid_t key )
99
123
{
100
124
int index = hashpid (key );
101
125
102
- struct respawn_node * prenode = NULL ;
103
126
struct respawn_node * node = first_nodes [index ];
104
127
while (node != NULL ) {
105
128
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 );
113
130
}
114
131
115
- prenode = node ;
116
132
node = node -> next ;
117
133
}
118
134
}
119
135
120
- static pid_t runapp (struct respawn_node * app )
136
+ static pid_t runapp (struct respawn_node * app )
121
137
{
122
138
pid_t pid ;
123
139
@@ -127,8 +143,8 @@ static pid_t runapp(struct respawn_node* app)
127
143
pid = ueld_run (app -> cmd , URF_CMDLINE , 0 , NULL );
128
144
}
129
145
130
- if (pid < 0 ) pid = 0 ;
131
- app -> pid = pid ;
146
+ if (pid < 0 )
147
+ pid = 0 ;
132
148
133
149
return pid ;
134
150
}
@@ -171,12 +187,13 @@ void respawn_init()
171
187
struct respawn_node * node ;
172
188
if ((node = nodenew ()) != NULL ) {
173
189
node -> vt = atoi (vt );
174
- node -> pid = 0 ;
175
190
node -> cmd = cmd ;
176
191
177
192
pid_t pid = runapp (node );
178
193
179
- if (unlikely (pid <= 0 )) {
194
+ node -> pid = pid ;
195
+
196
+ if (unlikely (pid == 0 )) {
180
197
ueld_print ("Run respwan process '%s' first time failed\n" , cmd );
181
198
} else {
182
199
appssz ++ ;
@@ -203,12 +220,12 @@ void respawnpid(pid_t pid)
203
220
if ((node = get (pid )) != NULL ) {
204
221
pid_t newpid = runapp (node );
205
222
206
- if (unlikely (newpid < = 0 )) {
223
+ if (unlikely (newpid = = 0 )) {
207
224
ueld_print ("Respwan process '%s' failed, remove it from list...\n" , node -> cmd );
208
- delete (node -> pid );
225
+ delete_node_without_index (node );
209
226
} else {
210
227
noderef (node );
211
- delete (node -> pid );
228
+ delete_node_without_index (node );
212
229
node -> pid = newpid ;
213
230
insert (newpid , node );
214
231
nodeunref (node );
@@ -234,5 +251,6 @@ void clearpid(pid_t pid)
234
251
first_nodes [i ] = NULL ;
235
252
}
236
253
}
254
+ munmap (respawn , length );
237
255
}
238
256
}
0 commit comments