|
Ian Kent |
0ab9b7 |
diff -u b/lib/master.c b/lib/master.c
|
|
Ian Kent |
0ab9b7 |
--- b/lib/master.c
|
|
Ian Kent |
e676fc |
+++ b/lib/master.c
|
|
Ian Kent |
0ab9b7 |
@@ -802,8 +802,8 @@
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
e676fc |
if (list_empty(&master->mounts)) {
|
|
Ian Kent |
e676fc |
master_mutex_unlock();
|
|
Ian Kent |
0ab9b7 |
- error(LOGOPT_ANY, "no mounts in table");
|
|
Ian Kent |
e676fc |
- return 0;
|
|
Ian Kent |
0ab9b7 |
+ warn(LOGOPT_ANY, "no mounts in table");
|
|
Ian Kent |
e676fc |
+ return 1;
|
|
Ian Kent |
e676fc |
}
|
|
Ian Kent |
e676fc |
|
|
Ian Kent |
e676fc |
master_mutex_unlock();
|
|
Ian Kent |
0ab9b7 |
--- a/daemon/automount.c
|
|
Ian Kent |
0ab9b7 |
+++ b/daemon/automount.c
|
|
Ian Kent |
0ab9b7 |
@@ -61,6 +61,8 @@ static size_t kpkt_len;
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
/* Attribute to create detached thread */
|
|
Ian Kent |
0ab9b7 |
pthread_attr_t thread_attr;
|
|
Ian Kent |
0ab9b7 |
+/* Attribute to create normal thread */
|
|
Ian Kent |
0ab9b7 |
+pthread_attr_t thread_attr_nodetach;
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
struct master_readmap_cond mrc = {
|
|
Ian Kent |
0ab9b7 |
PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, NULL, 0, 0, 0, 0};
|
|
Ian Kent |
0ab9b7 |
@@ -914,7 +916,7 @@ static void *do_notify_state(void *arg)
|
|
Ian Kent |
0ab9b7 |
return NULL;
|
|
Ian Kent |
0ab9b7 |
}
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
-static int do_signals(struct master *master, int sig)
|
|
Ian Kent |
0ab9b7 |
+static pthread_t do_signals(struct master *master, int sig)
|
|
Ian Kent |
0ab9b7 |
{
|
|
Ian Kent |
0ab9b7 |
pthread_t thid;
|
|
Ian Kent |
0ab9b7 |
int r_sig = sig;
|
|
Ian Kent |
0ab9b7 |
@@ -924,7 +926,7 @@ static int do_signals(struct master *master, int sig)
|
|
Ian Kent |
0ab9b7 |
if (status)
|
|
Ian Kent |
0ab9b7 |
fatal(status);
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
- status = pthread_create(&thid, &thread_attr, do_notify_state, &r_sig);
|
|
Ian Kent |
0ab9b7 |
+ status = pthread_create(&thid, &thread_attr_nodetach, do_notify_state, &r_sig);
|
|
Ian Kent |
0ab9b7 |
if (status) {
|
|
Ian Kent |
0ab9b7 |
error(master->default_logging,
|
|
Ian Kent |
0ab9b7 |
"mount state notify thread create failed");
|
|
Ian Kent |
0ab9b7 |
@@ -948,7 +950,7 @@ static int do_signals(struct master *master, int sig)
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
pthread_cleanup_pop(1);
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
- return 1;
|
|
Ian Kent |
0ab9b7 |
+ return thid;
|
|
Ian Kent |
0ab9b7 |
}
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
static void *do_read_master(void *arg)
|
|
Ian Kent |
0ab9b7 |
@@ -1038,6 +1040,7 @@ static int do_hup_signal(struct master *master, time_t age)
|
|
Ian Kent |
0ab9b7 |
/* Deal with all the signal-driven events in the state machine */
|
|
Ian Kent |
0ab9b7 |
static void *statemachine(void *arg)
|
|
Ian Kent |
0ab9b7 |
{
|
|
Ian Kent |
0ab9b7 |
+ pthread_t thid = 0;
|
|
Ian Kent |
0ab9b7 |
sigset_t signalset;
|
|
Ian Kent |
0ab9b7 |
int sig;
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
@@ -1048,15 +1051,17 @@ static void *statemachine(void *arg)
|
|
Ian Kent |
0ab9b7 |
while (1) {
|
|
Ian Kent |
0ab9b7 |
sigwait(&signalset, &sig);
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
-
|
|
Ian Kent |
0ab9b7 |
- if (master_list_empty(master_list))
|
|
Ian Kent |
0ab9b7 |
- return NULL;
|
|
Ian Kent |
0ab9b7 |
-
|
|
Ian Kent |
0ab9b7 |
switch (sig) {
|
|
Ian Kent |
0ab9b7 |
case SIGTERM:
|
|
Ian Kent |
0ab9b7 |
case SIGUSR2:
|
|
Ian Kent |
0ab9b7 |
case SIGUSR1:
|
|
Ian Kent |
0ab9b7 |
- do_signals(master_list, sig);
|
|
Ian Kent |
0ab9b7 |
+ thid = do_signals(master_list, sig);
|
|
Ian Kent |
0ab9b7 |
+ if (thid) {
|
|
Ian Kent |
0ab9b7 |
+ pthread_join(thid, NULL);
|
|
Ian Kent |
0ab9b7 |
+ if (master_list_empty(master_list))
|
|
Ian Kent |
0ab9b7 |
+ return NULL;
|
|
Ian Kent |
0ab9b7 |
+ thid = 0;
|
|
Ian Kent |
0ab9b7 |
+ }
|
|
Ian Kent |
0ab9b7 |
break;
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
case SIGHUP:
|
|
Ian Kent |
0ab9b7 |
@@ -1171,10 +1176,6 @@ static void handle_mounts_cleanup(void *arg)
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
msg("shut down path %s", path);
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
- /* If we are the last tell the state machine to shutdown */
|
|
Ian Kent |
0ab9b7 |
- if (!submount && master_list_empty(master_list))
|
|
Ian Kent |
0ab9b7 |
- kill(getpid(), SIGTERM);
|
|
Ian Kent |
0ab9b7 |
-
|
|
Ian Kent |
0ab9b7 |
return;
|
|
Ian Kent |
0ab9b7 |
}
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
@@ -1644,6 +1645,14 @@ int main(int argc, char *argv[])
|
|
Ian Kent |
0ab9b7 |
}
|
|
Ian Kent |
0ab9b7 |
#endif
|
|
Ian Kent |
0ab9b7 |
|
|
Ian Kent |
0ab9b7 |
+ if (pthread_attr_init(&thread_attr_nodetach)) {
|
|
Ian Kent |
0ab9b7 |
+ crit(LOGOPT_ANY,
|
|
Ian Kent |
0ab9b7 |
+ "%s: failed to init thread attribute struct!",
|
|
Ian Kent |
0ab9b7 |
+ program);
|
|
Ian Kent |
0ab9b7 |
+ close(start_pipefd[1]);
|
|
Ian Kent |
0ab9b7 |
+ exit(1);
|
|
Ian Kent |
0ab9b7 |
+ }
|
|
Ian Kent |
0ab9b7 |
+
|
|
Ian Kent |
0ab9b7 |
msg("Starting automounter version %s, master map %s",
|
|
Ian Kent |
0ab9b7 |
version, master_list->name);
|
|
Ian Kent |
0ab9b7 |
msg("using kernel protocol version %d.%02d",
|