[VOL-5537] openonu adapter crash fixes

Change-Id: I09b320ed97300c195bed97d182f1db1d251db502
Signed-off-by: bseeniva <balaji.seenivasan@radisys.com>
diff --git a/internal/pkg/core/device_handler.go b/internal/pkg/core/device_handler.go
index b185003..461369f 100755
--- a/internal/pkg/core/device_handler.go
+++ b/internal/pkg/core/device_handler.go
@@ -388,15 +388,18 @@
 		logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
 		return fmt.Errorf("no valid OnuDevice: %s", dh.DeviceID)
 	}
+	dh.lockDevice.RLock()
 	if dh.pOnuTP == nil {
 		//should normally not happen ...
 		logger.Errorw(ctx, "onuTechProf instance not set up for DLMsg request - ignoring request",
 			log.Fields{"device-id": dh.DeviceID})
+		dh.lockDevice.RUnlock()
 		return fmt.Errorf("techProfile DLMsg request while onuTechProf instance not setup: %s", dh.DeviceID)
 	}
 	if !dh.IsReadyForOmciConfig() {
 		logger.Errorw(ctx, "TechProf-set rejected: improper device state", log.Fields{"device-id": dh.DeviceID,
 			"device-state": dh.GetDeviceReasonString()})
+		dh.lockDevice.RUnlock()
 		return fmt.Errorf("improper device state %s on device %s", dh.GetDeviceReasonString(), dh.DeviceID)
 	}
 	//previous state test here was just this one, now extended for more states to reject the SetRequest:
@@ -408,6 +411,7 @@
 	// to possible concurrent access by flow processing
 	dh.pOnuTP.LockTpProcMutex()
 	defer dh.pOnuTP.UnlockTpProcMutex()
+	defer dh.lockDevice.RUnlock()
 
 	if techProfMsg.UniId >= platform.MaxUnisPerOnu {
 		return fmt.Errorf("received UniId value exceeds range: %d, device-id: %s",
@@ -484,15 +488,18 @@
 func (dh *deviceHandler) handleDeleteGemPortRequest(ctx context.Context, delGemPortMsg *ia.DeleteGemPortMessage) error {
 	logger.Infow(ctx, "delete-gem-port-request start", log.Fields{"device-id": dh.DeviceID})
 
+	dh.lockDevice.RLock()
 	if dh.pOnuTP == nil {
 		//should normally not happen ...
 		logger.Warnw(ctx, "onuTechProf instance not set up for DelGem request - ignoring request",
 			log.Fields{"device-id": dh.DeviceID})
+		dh.lockDevice.RUnlock()
 		return fmt.Errorf("techProfile DelGem request while onuTechProf instance not setup: %s", dh.DeviceID)
 	}
 	//compare TECH_PROFILE_DOWNLOAD_REQUEST
 	dh.pOnuTP.LockTpProcMutex()
 	defer dh.pOnuTP.UnlockTpProcMutex()
+	defer dh.lockDevice.RUnlock()
 
 	if delGemPortMsg.UniId >= platform.MaxUnisPerOnu {
 		logger.Errorw(ctx, "delete-gem-port UniId exceeds range", log.Fields{
@@ -524,16 +531,19 @@
 		logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
 		return fmt.Errorf("no valid OnuDevice: %s", dh.DeviceID)
 	}
+	dh.lockDevice.RLock()
 	if dh.pOnuTP == nil {
 		//should normally not happen ...
 		logger.Warnw(ctx, "onuTechProf instance not set up for DelTcont request - ignoring request",
 			log.Fields{"device-id": dh.DeviceID})
+		dh.lockDevice.RUnlock()
 		return fmt.Errorf("techProfile DelTcont request while onuTechProf instance not setup: %s", dh.DeviceID)
 	}
 
 	//compare TECH_PROFILE_DOWNLOAD_REQUEST
 	dh.pOnuTP.LockTpProcMutex()
 	defer dh.pOnuTP.UnlockTpProcMutex()
+	defer dh.lockDevice.RUnlock()
 
 	if delTcontMsg.UniId >= platform.MaxUnisPerOnu {
 		logger.Errorw(ctx, "delete-tcont UniId exceeds range", log.Fields{
@@ -925,8 +935,18 @@
 		dh.stopReconciling(ctx, false, cWaitReconcileFlowNoActivity)
 		return continueWithFlowConfig
 	}
+	dh.lockDevice.RLock()
+	if dh.pOnuTP == nil {
+		//should normally not happen ...
+		logger.Warnw(ctx, "onuTechProf instance not set up for reconcile tech prof - ignoring request",
+			log.Fields{"device-id": dh.DeviceID})
+		dh.lockDevice.RUnlock()
+		return continueWithFlowConfig
+	}
+
 	dh.pOnuTP.LockTpProcMutex()
 	defer dh.pOnuTP.UnlockTpProcMutex()
+	defer dh.lockDevice.RUnlock()
 
 	pDevEntry.MutexPersOnuConfig.RLock()
 	persMutexLock := true
@@ -5296,7 +5316,9 @@
 	}
 	dh.pOnuIndication = nil
 	dh.pOnuOmciDevice = nil
+	dh.lockDevice.Lock()
 	dh.pOnuTP = nil
+	dh.lockDevice.Unlock()
 	dh.pOnuMetricsMgr = nil
 	dh.pAlarmMgr = nil
 	dh.pSelfTestHdlr = nil