Пример #1
0
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);
    }

}
Пример #2
0
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);

}