Accepting request 1158254 from electronics
OBS-URL: https://build.opensuse.org/request/show/1158254 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/kicad?expand=0&rev=62
This commit is contained in:
commit
5c5ed210c2
133
0001-Fix-triangulationValid-check-race-for-zone-fill.patch
Normal file
133
0001-Fix-triangulationValid-check-race-for-zone-fill.patch
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
From 1c459e9a67151a6f028ac3a108b338e850126bfb Mon Sep 17 00:00:00 2001
|
||||||
|
From: StefanBruens <stefan.bruens@rwth-aachen.de>
|
||||||
|
Date: Wed, 13 Mar 2024 21:43:12 +0000
|
||||||
|
Subject: [PATCH] Fix triangulationValid check race for zone fill
|
||||||
|
|
||||||
|
The m_triangulationValid flag is used in several places without holding
|
||||||
|
the mutex, thus it should only ever be set when the triangulation is
|
||||||
|
guaranteed to be valid.
|
||||||
|
|
||||||
|
This can either be done by protecting both data and flag by the same
|
||||||
|
mutex, or updating the flag only after the triangulation has finished.
|
||||||
|
|
||||||
|
Also fix the case when the triangulation actually fails, the flag should
|
||||||
|
not be set in this case.
|
||||||
|
|
||||||
|
While at it, simplify the recalculation check. Only if both the
|
||||||
|
triangulation is valid, and the data hash is unchanged the recalculation
|
||||||
|
can be skipped - this is typically the case when two threads try to
|
||||||
|
update the cache concurrently, the second one will block at the mutex,
|
||||||
|
and will see the valid data after the first thread has finished.
|
||||||
|
|
||||||
|
Fixes #17180
|
||||||
|
---
|
||||||
|
libs/kimath/include/geometry/shape_poly_set.h | 3 +-
|
||||||
|
libs/kimath/src/geometry/shape_poly_set.cpp | 38 +++++++++----------
|
||||||
|
2 files changed, 21 insertions(+), 20 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libs/kimath/include/geometry/shape_poly_set.h b/libs/kimath/include/geometry/shape_poly_set.h
|
||||||
|
index ac5b2325744..e3d1ac18f35 100644
|
||||||
|
--- a/libs/kimath/include/geometry/shape_poly_set.h
|
||||||
|
+++ b/libs/kimath/include/geometry/shape_poly_set.h
|
||||||
|
@@ -28,6 +28,7 @@
|
||||||
|
#ifndef __SHAPE_POLY_SET_H
|
||||||
|
#define __SHAPE_POLY_SET_H
|
||||||
|
|
||||||
|
+#include <atomic>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <deque> // for deque
|
||||||
|
#include <iosfwd> // for string, stringstream
|
||||||
|
@@ -1538,7 +1539,7 @@ protected:
|
||||||
|
std::vector<POLYGON> m_polys;
|
||||||
|
std::vector<std::unique_ptr<TRIANGULATED_POLYGON>> m_triangulatedPolys;
|
||||||
|
|
||||||
|
- bool m_triangulationValid = false;
|
||||||
|
+ std::atomic<bool> m_triangulationValid = false;
|
||||||
|
std::mutex m_triangulationMutex;
|
||||||
|
|
||||||
|
private:
|
||||||
|
diff --git a/libs/kimath/src/geometry/shape_poly_set.cpp b/libs/kimath/src/geometry/shape_poly_set.cpp
|
||||||
|
index dacc1e8a07c..da379ad309a 100644
|
||||||
|
--- a/libs/kimath/src/geometry/shape_poly_set.cpp
|
||||||
|
+++ b/libs/kimath/src/geometry/shape_poly_set.cpp
|
||||||
|
@@ -2883,7 +2883,7 @@ SHAPE_POLY_SET &SHAPE_POLY_SET::operator=( const SHAPE_POLY_SET& aOther )
|
||||||
|
}
|
||||||
|
|
||||||
|
m_hash = aOther.m_hash;
|
||||||
|
- m_triangulationValid = aOther.m_triangulationValid;
|
||||||
|
+ m_triangulationValid = aOther.m_triangulationValid.load();
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
@@ -2985,25 +2985,16 @@ void SHAPE_POLY_SET::cacheTriangulation( bool aPartition, bool aSimplify,
|
||||||
|
std::vector<std::unique_ptr<TRIANGULATED_POLYGON>>* aHintData )
|
||||||
|
{
|
||||||
|
std::unique_lock<std::mutex> lock( m_triangulationMutex );
|
||||||
|
- bool recalculate = !m_hash.IsValid();
|
||||||
|
- MD5_HASH hash;
|
||||||
|
-
|
||||||
|
- if( !m_triangulationValid )
|
||||||
|
- recalculate = true;
|
||||||
|
|
||||||
|
- if( !recalculate )
|
||||||
|
+ if( m_triangulationValid && m_hash.IsValid() )
|
||||||
|
{
|
||||||
|
- hash = checksum();
|
||||||
|
-
|
||||||
|
- if( m_hash != hash )
|
||||||
|
- {
|
||||||
|
- m_hash = hash;
|
||||||
|
- recalculate = true;
|
||||||
|
- }
|
||||||
|
+ if( m_hash == checksum() )
|
||||||
|
+ return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if( !recalculate )
|
||||||
|
- return;
|
||||||
|
+ // Invalidate, in case anything goes wrong below
|
||||||
|
+ m_triangulationValid = false;
|
||||||
|
+ m_hash.SetValid( false );
|
||||||
|
|
||||||
|
auto triangulate =
|
||||||
|
[]( SHAPE_POLY_SET& polySet, int forOutline,
|
||||||
|
@@ -3054,7 +3045,6 @@ void SHAPE_POLY_SET::cacheTriangulation( bool aPartition, bool aSimplify,
|
||||||
|
};
|
||||||
|
|
||||||
|
m_triangulatedPolys.clear();
|
||||||
|
- m_triangulationValid = true;
|
||||||
|
|
||||||
|
if( aPartition )
|
||||||
|
{
|
||||||
|
@@ -3081,6 +3071,12 @@ void SHAPE_POLY_SET::cacheTriangulation( bool aPartition, bool aSimplify,
|
||||||
|
{
|
||||||
|
wxLogTrace( TRIANGULATE_TRACE, "Failed to triangulate partitioned polygon %d", ii );
|
||||||
|
}
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ m_hash = checksum();
|
||||||
|
+ // Set valid flag only after everything has been updated
|
||||||
|
+ m_triangulationValid = true;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
@@ -3095,9 +3091,13 @@ void SHAPE_POLY_SET::cacheTriangulation( bool aPartition, bool aSimplify,
|
||||||
|
{
|
||||||
|
wxLogTrace( TRIANGULATE_TRACE, "Failed to triangulate polygon" );
|
||||||
|
}
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ m_hash = checksum();
|
||||||
|
+ // Set valid flag only after everything has been updated
|
||||||
|
+ m_triangulationValid = true;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- m_hash = checksum();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
53
fix_zone_fill_race.patch
Normal file
53
fix_zone_fill_race.patch
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
From 81cb6d0c3fb92dd15f0a0e0d2d32337be1617399 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Seth Hillbrand <seth@kipro-pcb.com>
|
||||||
|
Date: Wed, 13 Mar 2024 10:33:43 -0700
|
||||||
|
Subject: [PATCH] Fix race condition in zone fill
|
||||||
|
|
||||||
|
When checking collisions, the SHAPE_POLY_SET::Collide() routine is not
|
||||||
|
const because it will regenerate the triangulation cache if it is out of
|
||||||
|
date (using a const_cast, grrr). This sidesteps the issue by assigning
|
||||||
|
a mutex to the triangulation caching
|
||||||
|
|
||||||
|
Fixes https://gitlab.com/kicad/code/kicad/-/issues/17180
|
||||||
|
---
|
||||||
|
libs/kimath/include/geometry/shape_poly_set.h | 4 +++-
|
||||||
|
libs/kimath/src/geometry/shape_poly_set.cpp | 1 +
|
||||||
|
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/libs/kimath/include/geometry/shape_poly_set.h b/libs/kimath/include/geometry/shape_poly_set.h
|
||||||
|
index 9ba7b5407b0..ac5b2325744 100644
|
||||||
|
--- a/libs/kimath/include/geometry/shape_poly_set.h
|
||||||
|
+++ b/libs/kimath/include/geometry/shape_poly_set.h
|
||||||
|
@@ -32,6 +32,7 @@
|
||||||
|
#include <deque> // for deque
|
||||||
|
#include <iosfwd> // for string, stringstream
|
||||||
|
#include <memory>
|
||||||
|
+#include <mutex>
|
||||||
|
#include <set> // for set
|
||||||
|
#include <stdexcept> // for out_of_range
|
||||||
|
#include <stdlib.h> // for abs
|
||||||
|
@@ -1537,7 +1538,8 @@ protected:
|
||||||
|
std::vector<POLYGON> m_polys;
|
||||||
|
std::vector<std::unique_ptr<TRIANGULATED_POLYGON>> m_triangulatedPolys;
|
||||||
|
|
||||||
|
- bool m_triangulationValid = false;
|
||||||
|
+ bool m_triangulationValid = false;
|
||||||
|
+ std::mutex m_triangulationMutex;
|
||||||
|
|
||||||
|
private:
|
||||||
|
MD5_HASH m_hash;
|
||||||
|
diff --git a/libs/kimath/src/geometry/shape_poly_set.cpp b/libs/kimath/src/geometry/shape_poly_set.cpp
|
||||||
|
index 407c43b9c6e..dacc1e8a07c 100644
|
||||||
|
--- a/libs/kimath/src/geometry/shape_poly_set.cpp
|
||||||
|
+++ b/libs/kimath/src/geometry/shape_poly_set.cpp
|
||||||
|
@@ -2984,6 +2984,7 @@ static SHAPE_POLY_SET partitionPolyIntoRegularCellGrid( const SHAPE_POLY_SET& aP
|
||||||
|
void SHAPE_POLY_SET::cacheTriangulation( bool aPartition, bool aSimplify,
|
||||||
|
std::vector<std::unique_ptr<TRIANGULATED_POLYGON>>* aHintData )
|
||||||
|
{
|
||||||
|
+ std::unique_lock<std::mutex> lock( m_triangulationMutex );
|
||||||
|
bool recalculate = !m_hash.IsValid();
|
||||||
|
MD5_HASH hash;
|
||||||
|
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:aee1630aac44ab181cedd293a54c339f623361cb6d5b374c27ca5389f80a28b6
|
|
||||||
size 72430414
|
|
3
kicad-8.0.1.tar.bz2
Normal file
3
kicad-8.0.1.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:7ea3f18650ce1b5359c685d10245efd95f87fa42ee52a1585bbc22d957617928
|
||||||
|
size 72453098
|
@ -1,3 +1,12 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Mar 15 11:10:26 UTC 2024 - Stefan Brüns <stefan.bruens@rwth-aachen.de>
|
||||||
|
|
||||||
|
- update to 8.0.1:
|
||||||
|
See https://www.kicad.org/blog/2024/03/KiCad-8.0.1-Release/ for details
|
||||||
|
- Fix some race condition, causing e.g. fails in qa_pcbnew:
|
||||||
|
* fix_zone_fill_race.patch
|
||||||
|
* 0001-Fix-triangulationValid-check-race-for-zone-fill.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Sun Feb 25 07:41:33 UTC 2024 - Stefan Brüns <stefan.bruens@rwth-aachen.de>
|
Sun Feb 25 07:41:33 UTC 2024 - Stefan Brüns <stefan.bruens@rwth-aachen.de>
|
||||||
|
|
||||||
|
22
kicad.spec
22
kicad.spec
@ -20,14 +20,18 @@
|
|||||||
# symbol libraries from version 8.0.0
|
# symbol libraries from version 8.0.0
|
||||||
%define compatversion 8.0.0
|
%define compatversion 8.0.0
|
||||||
Name: kicad
|
Name: kicad
|
||||||
Version: 8.0.0
|
Version: 8.0.1
|
||||||
%define file_version 8.0.0
|
%define file_version 8.0.1
|
||||||
Release: 0
|
Release: 0
|
||||||
Summary: EDA software suite for the creation of schematics and PCB
|
Summary: EDA software suite for the creation of schematics and PCB
|
||||||
License: AGPL-3.0-or-later AND GPL-3.0-or-later
|
License: AGPL-3.0-or-later AND GPL-3.0-or-later
|
||||||
Group: Productivity/Scientific/Electronics
|
Group: Productivity/Scientific/Electronics
|
||||||
URL: https://www.kicad.org
|
URL: https://www.kicad.org
|
||||||
Source: https://gitlab.com/kicad/code/kicad/-/archive/%{file_version}/kicad-%{file_version}.tar.bz2
|
Source: https://gitlab.com/kicad/code/kicad/-/archive/%{file_version}/kicad-%{file_version}.tar.bz2
|
||||||
|
# PATCH-FIX-UPSTREAM
|
||||||
|
Patch1: https://gitlab.com/kicad/code/kicad/-/commit/81cb6d0c3fb92dd15f0a0e0d2d32337be1617399.patch#/fix_zone_fill_race.patch
|
||||||
|
# PATCH-FIX-UPSTREAM
|
||||||
|
Patch2: https://gitlab.com/kicad/code/kicad/-/commit/1c459e9a67151a6f028ac3a108b338e850126bfb.patch#/0001-Fix-triangulationValid-check-race-for-zone-fill.patch
|
||||||
|
|
||||||
BuildRequires: cmake >= 3.16
|
BuildRequires: cmake >= 3.16
|
||||||
BuildRequires: fdupes
|
BuildRequires: fdupes
|
||||||
@ -185,17 +189,13 @@ chmod -x %{buildroot}%{_datadir}/kicad/scripting/*/*.py
|
|||||||
%find_lang %{name}
|
%find_lang %{name}
|
||||||
|
|
||||||
%check
|
%check
|
||||||
./build/kicad/kicad-cli version
|
./build/kicad/kicad-cli version --format about
|
||||||
%ctest --exclude-regex 'qa_spice|qa_cli|qa_common|qa_pcbnew'
|
%ctest --exclude-regex 'qa_spice|qa_cli|qa_common|qa_pcbnew'
|
||||||
|
|
||||||
%ifnarch %{ix86} aarch64
|
%ifnarch %{ix86}
|
||||||
%ctest --tests-regex 'qa_spice|qa_cli|qa_common|qa_pcbnew'
|
%ctest --tests-regex 'qa_spice|qa_cli|qa_common'
|
||||||
%endif
|
# Occasionally fails
|
||||||
|
%ctest --repeat until-fail:5 --tests-regex 'qa_pcbnew'
|
||||||
%ifarch aarch64
|
|
||||||
%ctest --tests-regex 'qa_cli|qa_common|qa_pcbnew'
|
|
||||||
# aarch64: https://sourceforge.net/p/ngspice/bugs/622/
|
|
||||||
%ctest --tests-regex 'qa_spice' || true
|
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%ifarch %{ix86}
|
%ifarch %{ix86}
|
||||||
|
Loading…
Reference in New Issue
Block a user