From 76a400ef1cfb8a1aef3f8e0af416a527837d3733 Mon Sep 17 00:00:00 2001 From: andig Date: Fri, 15 Jul 2022 11:16:58 +0200 Subject: [PATCH] Partially lock setVehicle to void deadlock in applyAction (#3857) --- core/loadpoint.go | 9 +++++++++ core/loadpoint_api.go | 7 +++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/core/loadpoint.go b/core/loadpoint.go index ad44bae31..92571c18a 100644 --- a/core/loadpoint.go +++ b/core/loadpoint.go @@ -786,6 +786,9 @@ func (lp *LoadPoint) selectVehicleByID(id string) api.Vehicle { // setActiveVehicle assigns currently active vehicle and configures soc estimator func (lp *LoadPoint) setActiveVehicle(vehicle api.Vehicle) { + lp.Lock() + defer lp.Unlock() + if lp.vehicle == vehicle { return } @@ -809,6 +812,9 @@ func (lp *LoadPoint) setActiveVehicle(vehicle api.Vehicle) { lp.publish("vehicleTitle", lp.vehicle.Title()) lp.publish("vehicleCapacity", lp.vehicle.Capacity()) + // release lock to unblock api + lp.Unlock() + // publish odometer once if vs, ok := lp.vehicle.(api.VehicleOdometer); ok { if odo, err := vs.Odometer(); err == nil { @@ -821,6 +827,9 @@ func (lp *LoadPoint) setActiveVehicle(vehicle api.Vehicle) { lp.applyAction(vehicle.OnIdentified()) + // re-apply lock to match defer above + lp.Lock() + lp.progress.Reset() } else { lp.socEstimator = nil diff --git a/core/loadpoint_api.go b/core/loadpoint_api.go index a2dada557..f59d335b5 100644 --- a/core/loadpoint_api.go +++ b/core/loadpoint_api.go @@ -266,12 +266,15 @@ func (lp *LoadPoint) GetVehicles() []api.Vehicle { // SetVehicle sets the active vehicle func (lp *LoadPoint) SetVehicle(vehicle api.Vehicle) { - lp.Lock() - defer lp.Unlock() + // TODO develop universal locking approach + // setActiveVehicle is protected by lock, hence no locking here // set desired vehicle lp.setActiveVehicle(vehicle) + lp.Lock() + defer lp.Unlock() + // disable auto-detect lp.stopVehicleDetection() }