--- mqtt/src/mqttd.c 2012/04/15 21:44:33 1.2.2.2 +++ mqtt/src/mqttd.c 2012/04/24 13:54:50 1.2.2.6 @@ -9,13 +9,14 @@ io_enableDEBUG; cfg_root_t cfg; sessions_t Sessions; +pubs_t Pubs; sched_root_task_t *root; sqlite3 *acc, *pub; pthread_mutex_t mtx_sess, mtx_pub; FILE *logg; extern char compiled[], compiledby[], compilehost[]; static char szCfgName[MAXPATHLEN]; -intptr_t Kill; +volatile intptr_t Kill; static void @@ -34,6 +35,7 @@ static void sigHand(int sig) { int stat; + struct tagSession *sess; switch (sig) { case SIGHUP: @@ -43,10 +45,16 @@ sigHand(int sig) break; } - syslog(LOG_ERR, "Error:: can't reload #%d - %s", cfg_GetErrno(), cfg_GetError()); + ioLIBERR(cfg); case SIGTERM: ioDEBUG(1, "Terminate MQTT service in progress"); Kill++; + + SESS_LOCK; + TAILQ_FOREACH(sess, &Sessions, sess_node) + if (sess->sess_tid) + pthread_cancel(sess->sess_tid); + SESS_UNLOCK; break; case SIGCHLD: while (waitpid(-1, &stat, WNOHANG) > 0); @@ -68,6 +76,7 @@ main(int argc, char **argv) ait_val_t v; TAILQ_INIT(&Sessions); + TAILQ_INIT(&Pubs); strlcpy(szCfgName, DEFAULT_CONFIG, sizeof szCfgName); while ((ch = getopt(argc, argv, "hvbc:")) != -1) @@ -155,7 +164,7 @@ main(int argc, char **argv) goto end; } else - ioVERBOSE(1) printf("Start service in batch mode ...\n"); + ioDEBUG(1, "Start service in batch mode ..."); memset(&sa, 0, sizeof sa); sigemptyset(&sa.sa_mask); @@ -181,15 +190,16 @@ main(int argc, char **argv) } if (!(root = schedBegin())) { - printf("Error:: scheduler #%d - %s\n", sched_GetErrno(), sched_GetError()); + ioLIBERR(sched); ret = 6; goto end; } + /* go catch the cat ... */ Run(sock); schedEnd(&root); -end: +end: /* free all resources */ srv_Close(sock); call.CloseLOG(logg); call.ClosePUB(pub);