|
@@ -106,18 +106,16 @@ static void resolv_sigchld ( struct async *async,
|
106
|
106
|
/* Reap the child */
|
107
|
107
|
async_wait ( async, &rc, 1 );
|
108
|
108
|
|
109
|
|
- /* If this child succeeded, kill all the others and return.
|
110
|
|
- * Killing the others means that this routine may be
|
111
|
|
- * re-entered; this is safe provided that no child returns a
|
112
|
|
- * success exit status when killed by SIGKILL.
|
|
109
|
+ /* If this child succeeded, kill all the others. They should
|
|
110
|
+ * immediately die (invoking resolv_sigchld() again, which
|
|
111
|
+ * won't do anything because the exit status is non-zero and
|
|
112
|
+ * the pending count won't reach zero until this instance
|
|
113
|
+ * completes).
|
113
|
114
|
*/
|
114
|
|
- if ( rc == 0 ) {
|
|
115
|
+ if ( rc == 0 )
|
115
|
116
|
async_signal_children ( async, SIGKILL );
|
116
|
|
- async_done ( async, 0 );
|
117
|
|
- return;
|
118
|
|
- }
|
119
|
117
|
|
120
|
|
- /* If we have no children left, return failure */
|
|
118
|
+ /* When we have no children left, exit */
|
121
|
119
|
if ( --(resolution->pending) == 0 )
|
122
|
120
|
async_done ( async, rc );
|
123
|
121
|
}
|
|
@@ -135,6 +133,7 @@ static void resolv_reap ( struct async *async ) {
|
135
|
133
|
static struct async_operations resolv_async_operations = {
|
136
|
134
|
.reap = resolv_reap,
|
137
|
135
|
.signal = {
|
|
136
|
+ [SIGKILL] = async_signal_children,
|
138
|
137
|
[SIGCHLD] = resolv_sigchld,
|
139
|
138
|
},
|
140
|
139
|
};
|