void ptpdShutdown(PtpClock * ptpClock) { extern RunTimeOpts rtOpts; netShutdown(&ptpClock->netPath); #ifdef PTPD_NTPDC ntpShutdown(&rtOpts.ntpOptions, &ptpClock->ntpControl); #endif /* PTPD_NTPDC */ free(ptpClock->foreign); /* free management messages, they can have dynamic memory allocated */ if(ptpClock->msgTmpHeader.messageType == MANAGEMENT) freeManagementTLV(&ptpClock->msgTmp.manage); freeManagementTLV(&ptpClock->outgoingManageTmp); #ifdef PTPD_SNMP snmpShutdown(); #endif /* PTPD_SNMP */ #ifdef HAVE_SYS_TIMEX_H #ifndef PTPD_STATISTICS /* Not running statistics code - write observed drift to driftfile if enabled, inform user */ if(ptpClock->slaveOnly && !ptpClock->servo.runningMaxOutput) saveDrift(ptpClock, &rtOpts, FALSE); #else /* We are running statistics code - save drift on exit only if we're not monitoring servo stability */ if(!rtOpts.servoStabilityDetection && !ptpClock->servo.runningMaxOutput) saveDrift(ptpClock, &rtOpts, FALSE); #endif /* PTPD_STATISTICS */ #endif /* HAVE_SYS_TIMEX_H */ if (rtOpts.currentConfig != NULL) dictionary_del(rtOpts.currentConfig); if(rtOpts.cliConfig != NULL) dictionary_del(rtOpts.cliConfig); FilterDestroy(ptpClock->owd_filt); FilterDestroy(ptpClock->ofm_filt); free(ptpClock); ptpClock = NULL; extern PtpClock* G_ptpClock; G_ptpClock = NULL; /* properly clean lockfile (eventough new deaemons can acquire the lock after we die) */ if(!rtOpts.ignore_daemon_lock && G_lockFilePointer != NULL) { fclose(G_lockFilePointer); } unlink(rtOpts.lockFile); if(rtOpts.statusLog.logEnabled) { /* close and remove the status file */ if(rtOpts.statusLog.logFP != NULL) fclose(rtOpts.statusLog.logFP); unlink(rtOpts.statusLog.logPath); } }
void ptpdShutdown(PtpClock * ptpClock) { extern RunTimeOpts rtOpts; /* * go into DISABLED state so the FSM can call any PTP-specific shutdown actions, * such as canceling unicast transmission */ toState(PTP_DISABLED, &rtOpts, ptpClock); netShutdown(&ptpClock->netPath); free(ptpClock->foreign); /* free management and signaling messages, they can have dynamic memory allocated */ if(ptpClock->msgTmpHeader.messageType == MANAGEMENT) freeManagementTLV(&ptpClock->msgTmp.manage); freeManagementTLV(&ptpClock->outgoingManageTmp); if(ptpClock->msgTmpHeader.messageType == SIGNALING) freeSignalingTLV(&ptpClock->msgTmp.signaling); freeSignalingTLV(&ptpClock->outgoingSignalingTmp); #ifdef PTPD_SNMP snmpShutdown(); #endif /* PTPD_SNMP */ #ifndef PTPD_STATISTICS /* Not running statistics code - write observed drift to driftfile if enabled, inform user */ if(ptpClock->slaveOnly && !ptpClock->servo.runningMaxOutput) saveDrift(ptpClock, &rtOpts, FALSE); #else ptpClock->oFilterMS.shutdown(&ptpClock->oFilterMS); ptpClock->oFilterSM.shutdown(&ptpClock->oFilterSM); freeDoubleMovingStatFilter(&ptpClock->filterMS); freeDoubleMovingStatFilter(&ptpClock->filterSM); /* We are running statistics code - save drift on exit only if we're not monitoring servo stability */ if(!rtOpts.servoStabilityDetection && !ptpClock->servo.runningMaxOutput) saveDrift(ptpClock, &rtOpts, FALSE); #endif /* PTPD_STATISTICS */ if (rtOpts.currentConfig != NULL) dictionary_del(&rtOpts.currentConfig); if(rtOpts.cliConfig != NULL) dictionary_del(&rtOpts.cliConfig); timerShutdown(ptpClock->timers); free(ptpClock); ptpClock = NULL; extern PtpClock* G_ptpClock; G_ptpClock = NULL; /* properly clean lockfile (eventough new deaemons can acquire the lock after we die) */ if(!rtOpts.ignore_daemon_lock && G_lockFilePointer != NULL) { fclose(G_lockFilePointer); G_lockFilePointer = NULL; } unlink(rtOpts.lockFile); if(rtOpts.statusLog.logEnabled) { /* close and remove the status file */ if(rtOpts.statusLog.logFP != NULL) { fclose(rtOpts.statusLog.logFP); rtOpts.statusLog.logFP = NULL; } unlink(rtOpts.statusLog.logPath); } stopLogging(&rtOpts); }