Mir

Merge lp:mir/0.12 into lp:mir/ubuntu

Proposed by Alexandros Frantzis
Status: Merged
Approved by: Alexandros Frantzis
Approved revision: 2308
Merged at revision: 1225
Proposed branch: lp:mir/0.12
Merge into: lp:mir/ubuntu
Diff against target: 2349 lines (+1697/-127)
23 files modified
3rd_party/android-input/android/frameworks/base/services/input/InputDispatcher.cpp (+36/-31)
cmake/MirCommon.cmake (+2/-0)
debian/changelog (+22/-0)
src/CMakeLists.txt (+1/-1)
src/platforms/android/server/hwc_blanking_control.cpp (+14/-1)
src/platforms/mesa/server/cursor.cpp (+31/-3)
src/server/frontend/protobuf_message_processor.cpp (+42/-15)
src/server/frontend/protobuf_message_processor.h (+2/-1)
src/server/frontend/protobuf_responder.cpp (+9/-5)
src/server/frontend/protobuf_responder.h (+2/-0)
src/server/frontend/session_mediator.cpp (+25/-26)
src/server/frontend/session_mediator.h (+2/-0)
src/server/frontend/surface_tracker.cpp (+8/-1)
src/server/frontend/surface_tracker.h (+6/-3)
src/server/graphics/software_cursor.cpp (+8/-20)
src/server/graphics/software_cursor.h (+1/-1)
tests/acceptance-tests/throwback/test_client_input.cpp (+3/-2)
tests/unit-tests/frontend/test_protobuf_message_processor.cpp (+1/-1)
tests/unit-tests/graphics/android/test_hwc_configuration.cpp (+28/-13)
tests/unit-tests/graphics/test_software_cursor.cpp (+20/-0)
tests/unit-tests/test_fatal.cpp (+3/-3)
tools/valgrind_suppressions_armhf (+27/-0)
tools/valgrind_suppressions_glibc_2.21 (+1404/-0)
To merge this branch: bzr merge lp:mir/0.12
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Needs Fixing
Mir development team Pending
Review via email: mp+253528@code.launchpad.net

Commit message

Release 0.12.1

Description of the change

Release 0.12.1

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Good signs so far. The absence of "symbols.map" or "+++ include/" indicates no ABI breaks :)

Revision history for this message
Alexandros Frantzis (afrantzis) wrote :

The change to double buffering is causing some choppiness on krillin (e.g. when flicking apps scope in unity8-dash). Either unity8-dash or unity8 (less likely), is not rendering fast enough to support smooth double buffering. We will probably need to revert the change, but I would appreciate it if someone else also tried the packages too:

https://jenkins.qa.ubuntu.com/job/mir-ubuntu-vivid-armhf-ci/29/artifact/*zip*/archive.zip

lp:mir/0.12 updated
2305. By Alberto Aguirre

Fix vivid build failure arising from upstream toolchain upgrades.
(LP: #1435127)

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
lp:mir/0.12 updated
2306. By Alexandros Frantzis

Revert commit 2297 'Always use double buffers instead of triple. (LP: #1240909)'

Various applications on the phone (notably the Apps scope) are not fast enough
to work smoothly with double buffering.

Revision history for this message
Alexandros Frantzis (afrantzis) wrote :

Daniel has verified my findings on the phone. I have reverted back to triple buffering.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
lp:mir/0.12 updated
2307. By Alexandros Frantzis

Provide our own version of glibc 2.21 default valgrind suppressions and extra armhf suppressions (LP: #1435186)

Backported from lp:mir r2420

2308. By Alexandros Frantzis

Update changelog for 0.12.1 release

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '3rd_party/android-input/android/frameworks/base/services/input/InputDispatcher.cpp'
2--- 3rd_party/android-input/android/frameworks/base/services/input/InputDispatcher.cpp 2015-02-02 12:18:18 +0000
3+++ 3rd_party/android-input/android/frameworks/base/services/input/InputDispatcher.cpp 2015-03-24 12:55:40 +0000
4@@ -1224,36 +1224,36 @@
5 "eventually add a new window when it finishes starting up.");
6 goto Unresponsive;
7 }
8-
9- ALOGI("Dropping event because there is no touched window.");
10- injectionResult = INPUT_EVENT_INJECTION_FAILED;
11- goto Failed;
12- }
13- }
14-
15- // Set target flags.
16- int32_t targetFlags = InputTarget::FLAG_FOREGROUND | InputTarget::FLAG_DISPATCH_AS_IS;
17- if (isSplit) {
18- targetFlags |= InputTarget::FLAG_SPLIT;
19- }
20- if (isWindowObscuredAtPointLocked(newTouchedWindowHandle, x, y)) {
21- targetFlags |= InputTarget::FLAG_WINDOW_IS_OBSCURED;
22- }
23-
24- // Update hover state.
25- if (isHoverAction) {
26- newHoverWindowHandle = newTouchedWindowHandle;
27- } else if (maskedAction == AMOTION_EVENT_ACTION_SCROLL) {
28- newHoverWindowHandle = mLastHoverWindowHandle;
29- }
30-
31- // Update the temporary touch state.
32- IntSet pointerIds;
33- if (isSplit) {
34- int32_t pointerId = entry->pointerProperties[pointerIndex].id;
35- pointerIds.insert(pointerId);
36- }
37- mTempTouchState.addOrUpdateWindow(newTouchedWindowHandle, targetFlags, pointerIds);
38+ }
39+ }
40+
41+ // We may still not have a window handle but we can't just abort the dispatch
42+ // cycle because there could be hover exits to dispatch.
43+ if (newTouchedWindowHandle != NULL) {
44+ // Set target flags.
45+ int32_t targetFlags = InputTarget::FLAG_FOREGROUND | InputTarget::FLAG_DISPATCH_AS_IS;
46+ if (isSplit) {
47+ targetFlags |= InputTarget::FLAG_SPLIT;
48+ }
49+ if (isWindowObscuredAtPointLocked(newTouchedWindowHandle, x, y)) {
50+ targetFlags |= InputTarget::FLAG_WINDOW_IS_OBSCURED;
51+ }
52+
53+ // Update hover state.
54+ if (isHoverAction) {
55+ newHoverWindowHandle = newTouchedWindowHandle;
56+ } else if (maskedAction == AMOTION_EVENT_ACTION_SCROLL) {
57+ newHoverWindowHandle = mLastHoverWindowHandle;
58+ }
59+
60+ // Update the temporary touch state.
61+ IntSet pointerIds;
62+ if (isSplit) {
63+ int32_t pointerId = entry->pointerProperties[pointerIndex].id;
64+ pointerIds.insert(pointerId);
65+ }
66+ mTempTouchState.addOrUpdateWindow(newTouchedWindowHandle, targetFlags, pointerIds);
67+ }
68 } else {
69 /* Case 2: Pointer move, up, cancel or non-splittable pointer down. */
70
71@@ -1277,6 +1277,9 @@
72 sp<InputWindowHandle> oldTouchedWindowHandle =
73 mTempTouchState.getFirstForegroundWindowHandle();
74 sp<InputWindowHandle> newTouchedWindowHandle = findTouchedWindowAtLocked(x, y);
75+
76+ newHoverWindowHandle = newTouchedWindowHandle;
77+
78 if (oldTouchedWindowHandle != newTouchedWindowHandle
79 && newTouchedWindowHandle != NULL) {
80 #if DEBUG_FOCUS
81@@ -1339,7 +1342,9 @@
82 bool haveForegroundWindow = false;
83 for (size_t i = 0; i < mTempTouchState.windows.size(); i++) {
84 const TouchedWindow& touchedWindow = mTempTouchState.windows[i];
85- if (touchedWindow.targetFlags & InputTarget::FLAG_FOREGROUND) {
86+ if (touchedWindow.targetFlags & InputTarget::FLAG_FOREGROUND ||
87+ // We allow dispatching hover exit events to non foreground windows.
88+ touchedWindow.targetFlags & InputTarget::FLAG_DISPATCH_AS_HOVER_EXIT) {
89 haveForegroundWindow = true;
90 if (! checkInjectionPermission(touchedWindow.windowHandle,
91 entry->injectionState)) {
92
93=== modified file 'cmake/MirCommon.cmake'
94--- cmake/MirCommon.cmake 2015-01-21 07:34:50 +0000
95+++ cmake/MirCommon.cmake 2015-03-24 12:55:40 +0000
96@@ -30,8 +30,10 @@
97 if(VALGRIND_EXECUTABLE)
98 set(VALGRIND_ARGS "--error-exitcode=1" "--trace-children=yes" "--leak-check=full" "--show-leak-kinds=definite" "--errors-for-leak-kinds=definite")
99 set(VALGRIND_ARGS ${VALGRIND_ARGS} "--suppressions=${CMAKE_SOURCE_DIR}/tools/valgrind_suppressions_generic")
100+ set(VALGRIND_ARGS ${VALGRIND_ARGS} "--suppressions=${CMAKE_SOURCE_DIR}/tools/valgrind_suppressions_glibc_2.21")
101 set(DISCOVER_FLAGS "--enable-memcheck")
102 set(DISCOVER_FLAGS ${DISCOVER_FLAGS} "--suppressions=${CMAKE_SOURCE_DIR}/tools/valgrind_suppressions_generic")
103+ set(DISCOVER_FLAGS ${DISCOVER_FLAGS} "--suppressions=${CMAKE_SOURCE_DIR}/tools/valgrind_suppressions_glibc_2.21")
104 if (TARGET_ARCH STREQUAL "arm-linux-gnueabihf")
105 set(VALGRIND_ARGS ${VALGRIND_ARGS} "--suppressions=${CMAKE_SOURCE_DIR}/tools/valgrind_suppressions_armhf")
106 set(DISCOVER_FLAGS ${DISCOVER_FLAGS} "--suppressions=${CMAKE_SOURCE_DIR}/tools/valgrind_suppressions_armhf")
107
108=== modified file 'debian/changelog'
109--- debian/changelog 2015-02-28 10:30:53 +0000
110+++ debian/changelog 2015-03-24 12:55:40 +0000
111@@ -1,3 +1,25 @@
112+mir (0.12.1-0ubuntu1) UNRELEASED; urgency=medium
113+
114+ * New upstream release 0.12.1 (https://launchpad.net/mir/+milestone/0.12.1)
115+ - Bug fixes:
116+ . [regression] mali, powervr locks up with around the introduction or
117+ removal of a third overlay (LP: #1413211)
118+ . USC - mouse cursor on AMD graphics is drawing incorrectly
119+ (LP: #1417581)
120+ . mir_demo_server doesn't emit hover_exit events (LP: #1418569)
121+ . SessionMediator locks mutexes in one thread and unlocks them in
122+ another (LP: #1427976)
123+ . ProtobufResponder::send_response_result race (LP: #1428402)
124+ . Some protobuf Closure objects can access dead objects (LP: #1433330)
125+ . DisplayConfigurationOutput.physical_size_mm is undefined/zero
126+ (LP: #1430315)
127+ . vivid fails to build Mir as of 2015-03-22: error: #warning
128+ "_BSD_SOURCE and _SVID_SOURCE are deprecated, use _DEFAULT_SOURCE"
129+ [-Werror=cpp] (LP: #1435127)
130+ . valgrind on armhf fails with with many errors (LP: #1435186)
131+
132+ -- Alexandros Frantzis <alexandros.frantzis@canonical.com> Tue, 24 Mar 2015 11:07:41 +0200
133+
134 mir (0.12.0+15.04.20150228-0ubuntu1) vivid; urgency=medium
135
136 [ Alberto Aguirre ]
137
138=== modified file 'src/CMakeLists.txt'
139--- src/CMakeLists.txt 2015-02-23 19:54:43 +0000
140+++ src/CMakeLists.txt 2015-03-24 12:55:40 +0000
141@@ -26,7 +26,7 @@
142 set_property(TARGET wrapper
143 APPEND_STRING PROPERTY COMPILE_FLAGS " -DEXECUTABLE_FORMAT=\\\".%s-uninstalled\\\"")
144 set_property(TARGET wrapper
145- APPEND_STRING PROPERTY COMPILE_FLAGS " -D_BSD_SOURCE")
146+ APPEND_STRING PROPERTY COMPILE_FLAGS " -D_DEFAULT_SOURCE -D_BSD_SOURCE")
147
148 set(
149 MIR_GENERATED_INCLUDE_DIRECTORIES
150
151=== modified file 'src/platforms/android/server/hwc_blanking_control.cpp'
152--- src/platforms/android/server/hwc_blanking_control.cpp 2015-01-27 03:02:22 +0000
153+++ src/platforms/android/server/hwc_blanking_control.cpp 2015-03-24 12:55:40 +0000
154@@ -19,6 +19,7 @@
155 #include "hwc_configuration.h"
156 #include "hwc_wrapper.h"
157 #include "android_format_conversion-inl.h"
158+#include "mir/geometry/length.h"
159 #include <EGL/egl.h>
160 #include <EGL/eglext.h>
161 #include <boost/throw_exception.hpp>
162@@ -26,6 +27,7 @@
163 #include <chrono>
164
165 namespace mga = mir::graphics::android;
166+namespace geom = mir::geometry;
167
168 namespace
169 {
170@@ -99,6 +101,17 @@
171 }
172 }
173
174+namespace
175+{
176+int dpi_to_mm(uint32_t dpi, int pixel_num)
177+{
178+ if (dpi == 0) return 0;
179+ float dpi_inches = dpi / 1000.0f; //android multiplies by 1000
180+ geom::Length length(pixel_num / dpi_inches, geom::Length::Units::inches);
181+ return length.as(geom::Length::Units::millimetres);
182+}
183+}
184+
185 mga::DisplayAttribs mga::HwcBlankingControl::active_attribs_for(DisplayName display_name)
186 {
187 auto configs = hwc_device->display_configs(display_name);
188@@ -127,7 +140,7 @@
189 hwc_device->display_attributes(display_name, configs.front(), attributes, values);
190 return {
191 {values[0], values[1]},
192- {0, 0}, //TODO: convert DPI to MM and return
193+ {dpi_to_mm(values[3], values[0]), dpi_to_mm(values[4], values[1])},
194 period_to_hz(std::chrono::nanoseconds{values[2]}),
195 true,
196 format,
197
198=== modified file 'src/platforms/mesa/server/cursor.cpp'
199--- src/platforms/mesa/server/cursor.cpp 2015-01-22 09:00:14 +0000
200+++ src/platforms/mesa/server/cursor.cpp 2015-03-24 12:55:40 +0000
201@@ -24,6 +24,9 @@
202 #include "mir/geometry/rectangle.h"
203 #include "mir/graphics/cursor_image.h"
204
205+#include <xf86drm.h>
206+#include <drm/drm.h>
207+
208 #include <boost/exception/errinfo_errno.hpp>
209
210 #include <stdexcept>
211@@ -35,7 +38,7 @@
212
213 namespace
214 {
215-const uint64_t requested_cursor_size = 64;
216+const uint64_t fallback_cursor_size = 64;
217
218 // Transforms a relative position within the display bounds described by \a rect which is rotated with \a orientation
219 geom::Displacement transform(geom::Rectangle const& rect, geom::Displacement const& vector, MirOrientation orientation)
220@@ -53,13 +56,38 @@
221 return vector;
222 }
223 }
224+// support for older drm headers
225+#ifndef DRM_CAP_CURSOR_WIDTH
226+#define DRM_CAP_CURSOR_WIDTH 0x8
227+#define DRM_CAP_CURSOR_HEIGHT 0x9
228+#endif
229+
230+// In certain combinations of DRI backends and drivers GBM
231+// returns a stride size that matches the requested buffers size,
232+// instead of the underlying buffer:
233+// https://bugs.freedesktop.org/show_bug.cgi?id=89164
234+int get_drm_cursor_height(int fd)
235+{
236+ uint64_t height;
237+ if (drmGetCap(fd, DRM_CAP_CURSOR_HEIGHT, &height) < 0)
238+ height = fallback_cursor_size;
239+ return int(height);
240+}
241+
242+int get_drm_cursor_width(int fd)
243+{
244+ uint64_t width;
245+ if (drmGetCap(fd, DRM_CAP_CURSOR_WIDTH, &width) < 0)
246+ width = fallback_cursor_size;
247+ return int(width);
248+}
249 }
250
251 mgm::Cursor::GBMBOWrapper::GBMBOWrapper(gbm_device* gbm) :
252 buffer(gbm_bo_create(
253 gbm,
254- requested_cursor_size,
255- requested_cursor_size,
256+ get_drm_cursor_width(gbm_device_get_fd(gbm)),
257+ get_drm_cursor_height(gbm_device_get_fd(gbm)),
258 GBM_FORMAT_ARGB8888,
259 GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE))
260 {
261
262=== modified file 'src/server/frontend/protobuf_message_processor.cpp'
263--- src/server/frontend/protobuf_message_processor.cpp 2015-01-27 03:02:22 +0000
264+++ src/server/frontend/protobuf_message_processor.cpp 2015-03-24 12:55:40 +0000
265@@ -74,9 +74,35 @@
266 return request;
267 }
268
269+class SelfDeletingCallback : public google::protobuf::Closure
270+{
271+public:
272+ SelfDeletingCallback(std::function<void()> const& callback)
273+ : callback(callback)
274+ {
275+ }
276+
277+ void Run() override
278+ {
279+ struct Deleter
280+ {
281+ ~Deleter() { delete obj; }
282+ SelfDeletingCallback* obj;
283+ };
284+ Deleter deleter{this};
285+ callback();
286+ }
287+
288+ private:
289+ ~SelfDeletingCallback() = default;
290+ SelfDeletingCallback(SelfDeletingCallback&) = delete;
291+ void operator=(const SelfDeletingCallback&) = delete;
292+ std::function<void()> callback;
293+};
294+
295 template<typename RequestType, typename ResponseType>
296 void invoke(
297- ProtobufMessageProcessor* self,
298+ std::shared_ptr<ProtobufMessageProcessor> const& mp,
299 DisplayServer* server,
300 void (mir::protobuf::DisplayServer::*function)(
301 ::google::protobuf::RpcController* controller,
302@@ -88,15 +114,17 @@
303 {
304 auto const result_message = std::make_shared<ResponseType>();
305
306- auto const callback =
307- google::protobuf::NewCallback<
308- ProtobufMessageProcessor,
309- ::google::protobuf::uint32,
310- std::shared_ptr<ResponseType>>(
311- self,
312- &ProtobufMessageProcessor::send_response,
313- invocation_id,
314- result_message);
315+ std::weak_ptr<ProtobufMessageProcessor> weak_mp = mp;
316+ auto const response_callback = [weak_mp, invocation_id, result_message]
317+ {
318+ auto message_processor = weak_mp.lock();
319+ if (message_processor)
320+ {
321+ message_processor->send_response(invocation_id, result_message);
322+ }
323+ };
324+
325+ auto callback = new SelfDeletingCallback{response_callback};
326
327 try
328 {
329@@ -108,9 +136,8 @@
330 }
331 catch (std::exception const& x)
332 {
333- delete callback;
334 result_message->set_error(boost::diagnostic_information(x));
335- self->send_response(invocation_id, result_message);
336+ callback->Run();
337 }
338 }
339
340@@ -179,7 +206,7 @@
341 else if ("next_buffer" == invocation.method_name())
342 {
343 auto request = parse_parameter<mir::protobuf::SurfaceId>(invocation);
344- invoke(this, display_server.get(), &DisplayServer::next_buffer, invocation.id(), &request);
345+ invoke(shared_from_this(), display_server.get(), &DisplayServer::next_buffer, invocation.id(), &request);
346 }
347 else if ("exchange_buffer" == invocation.method_name())
348 {
349@@ -187,7 +214,7 @@
350 request.mutable_buffer()->clear_fd();
351 for (auto& fd : side_channel_fds)
352 request.mutable_buffer()->add_fd(fd);
353- invoke(this, display_server.get(), &DisplayServer::exchange_buffer, invocation.id(), &request);
354+ invoke(shared_from_this(), display_server.get(), &DisplayServer::exchange_buffer, invocation.id(), &request);
355 }
356 else if ("release_surface" == invocation.method_name())
357 {
358@@ -205,7 +232,7 @@
359 for (auto& fd : side_channel_fds)
360 request.add_fd(fd);
361
362- invoke(this, display_server.get(), &DisplayServer::platform_operation,
363+ invoke(shared_from_this(), display_server.get(), &DisplayServer::platform_operation,
364 invocation.id(), &request);
365 }
366 else if ("configure_display" == invocation.method_name())
367
368=== modified file 'src/server/frontend/protobuf_message_processor.h'
369--- src/server/frontend/protobuf_message_processor.h 2015-01-21 07:34:50 +0000
370+++ src/server/frontend/protobuf_message_processor.h 2015-03-24 12:55:40 +0000
371@@ -37,7 +37,8 @@
372 class DisplayServer;
373 class ProtobufMessageSender;
374
375-class ProtobufMessageProcessor : public MessageProcessor
376+class ProtobufMessageProcessor : public MessageProcessor,
377+ public std::enable_shared_from_this<ProtobufMessageProcessor>
378 {
379 public:
380 ProtobufMessageProcessor(
381
382=== modified file 'src/server/frontend/protobuf_responder.cpp'
383--- src/server/frontend/protobuf_responder.cpp 2015-01-21 07:34:50 +0000
384+++ src/server/frontend/protobuf_responder.cpp 2015-03-24 12:55:40 +0000
385@@ -43,11 +43,15 @@
386
387 response->SerializeWithCachedSizesToArray(send_response_buffer.data());
388
389- send_response_result.set_id(id);
390- send_response_result.set_response(send_response_buffer.data(), send_response_buffer.size());
391-
392- send_response_buffer.resize(send_response_result.ByteSize());
393- send_response_result.SerializeWithCachedSizesToArray(send_response_buffer.data());
394+ {
395+ std::lock_guard<decltype(result_guard)> lock{result_guard};
396+
397+ send_response_result.set_id(id);
398+ send_response_result.set_response(send_response_buffer.data(), send_response_buffer.size());
399+
400+ send_response_buffer.resize(send_response_result.ByteSize());
401+ send_response_result.SerializeWithCachedSizesToArray(send_response_buffer.data());
402+ }
403
404 sender->send(reinterpret_cast<char*>(send_response_buffer.data()), send_response_buffer.size(), fd_sets);
405 resource_cache->free_resource(response);
406
407=== modified file 'src/server/frontend/protobuf_responder.h'
408--- src/server/frontend/protobuf_responder.h 2015-01-21 07:34:50 +0000
409+++ src/server/frontend/protobuf_responder.h 2015-03-24 12:55:40 +0000
410@@ -23,6 +23,7 @@
411 #include "mir_protobuf_wire.pb.h"
412
413 #include <memory>
414+#include <mutex>
415
416 namespace mir
417 {
418@@ -50,6 +51,7 @@
419 std::shared_ptr<MessageSender> const sender;
420 std::shared_ptr<ResourceCache> const resource_cache;
421
422+ std::mutex result_guard;
423 mir::protobuf::wire::Result send_response_result;
424 };
425 }
426
427=== modified file 'src/server/frontend/session_mediator.cpp'
428--- src/server/frontend/session_mediator.cpp 2015-02-02 12:18:18 +0000
429+++ src/server/frontend/session_mediator.cpp 2015-03-24 12:55:40 +0000
430@@ -60,6 +60,7 @@
431 #include <boost/throw_exception.hpp>
432
433 #include <mutex>
434+#include <thread>
435 #include <functional>
436
437 namespace ms = mir::scene;
438@@ -150,17 +151,27 @@
439 void mf::SessionMediator::advance_buffer(
440 SurfaceId surf_id,
441 Surface& surface,
442+ graphics::Buffer* old_buffer,
443+ std::unique_lock<std::mutex>& lock,
444 std::function<void(graphics::Buffer*, graphics::BufferIpcMsgType)> complete)
445 {
446- auto client_buffer = surface_tracker.last_buffer(surf_id);
447+ auto const tid = std::this_thread::get_id();
448+
449 surface.swap_buffers(
450- client_buffer,
451- [this, surf_id, complete](mg::Buffer* new_buffer)
452+ old_buffer,
453+ // Note: We assume that the lambda will be executed within swap_buffers
454+ // (in which case the lock reference is valid) or in a different thread
455+ // altogether (in which case the dangling reference is not accessed)
456+ [this, tid, &lock, surf_id, complete](mg::Buffer* new_buffer)
457 {
458+ if (tid == std::this_thread::get_id())
459+ lock.unlock();
460+
461 if (surface_tracker.track_buffer(surf_id, new_buffer))
462 complete(new_buffer, mg::BufferIpcMsgType::update_msg);
463 else
464 complete(new_buffer, mg::BufferIpcMsgType::full_msg);
465+
466 });
467 }
468
469@@ -171,7 +182,7 @@
470 google::protobuf::Closure* done)
471 {
472
473- auto const lock = std::make_shared<std::unique_lock<std::mutex>>(session_mutex);
474+ std::unique_lock<std::mutex> lock{session_mutex};
475
476 auto const session = weak_session.lock();
477
478@@ -241,12 +252,10 @@
479 setting->set_ivalue(shell->get_surface_attribute(session, surf_id, static_cast<MirSurfaceAttrib>(i)));
480 }
481
482- advance_buffer(surf_id, *surface,
483- [lock, this, &surf_id, response, done, session]
484+ advance_buffer(surf_id, *surface, surface_tracker.last_buffer(surf_id), lock,
485+ [this, surf_id, response, done, session]
486 (graphics::Buffer* client_buffer, graphics::BufferIpcMsgType msg_type)
487 {
488- lock->unlock();
489-
490 response->mutable_buffer_stream()->mutable_id()->set_value(
491 surf_id.as_value());
492 pack_protobuf_buffer(*response->mutable_buffer_stream()->mutable_buffer(),
493@@ -270,7 +279,7 @@
494 {
495 SurfaceId const surf_id{request->value()};
496
497- auto const lock = std::make_shared<std::unique_lock<std::mutex>>(session_mutex);
498+ std::unique_lock<std::mutex> lock{session_mutex};
499
500 auto const session = weak_session.lock();
501
502@@ -280,15 +289,11 @@
503 report->session_next_buffer_called(session->name());
504
505 auto surface = session->get_surface(surf_id);
506-
507- advance_buffer(surf_id, *surface,
508- [lock, this, response, done, session]
509+ advance_buffer(surf_id, *surface, surface_tracker.last_buffer(surf_id), lock,
510+ [this, response, done]
511 (graphics::Buffer* client_buffer, graphics::BufferIpcMsgType msg_type)
512 {
513- lock->unlock();
514-
515 pack_protobuf_buffer(*response, client_buffer, msg_type);
516-
517 done->Run();
518 });
519 }
520@@ -305,7 +310,7 @@
521 mfd::ProtobufBufferPacker request_msg{const_cast<mir::protobuf::Buffer*>(&request->buffer())};
522 ipc_operations->unpack_buffer(request_msg, *surface_tracker.last_buffer(surface_id));
523
524- auto const lock = std::make_shared<std::unique_lock<std::mutex>>(session_mutex);
525+ std::unique_lock<std::mutex> lock{session_mutex};
526 auto const session = weak_session.lock();
527 if (!session)
528 BOOST_THROW_EXCEPTION(std::logic_error("Invalid application session"));
529@@ -313,17 +318,11 @@
530 report->session_exchange_buffer_called(session->name());
531
532 auto const& surface = session->get_surface(surface_id);
533- surface->swap_buffers(
534- surface_tracker.buffer_from(buffer_id),
535- [this, surface_id, lock, response, done](mg::Buffer* new_buffer)
536+ advance_buffer(surface_id, *surface, surface_tracker.buffer_from(buffer_id), lock,
537+ [this, response, done]
538+ (graphics::Buffer* new_buffer, graphics::BufferIpcMsgType msg_type)
539 {
540- lock->unlock();
541-
542- if (surface_tracker.track_buffer(surface_id, new_buffer))
543- pack_protobuf_buffer(*response, new_buffer, mg::BufferIpcMsgType::update_msg);
544- else
545- pack_protobuf_buffer(*response, new_buffer, mg::BufferIpcMsgType::full_msg);
546-
547+ pack_protobuf_buffer(*response, new_buffer, msg_type);
548 done->Run();
549 });
550 }
551
552=== modified file 'src/server/frontend/session_mediator.h'
553--- src/server/frontend/session_mediator.h 2015-01-21 07:34:50 +0000
554+++ src/server/frontend/session_mediator.h 2015-03-24 12:55:40 +0000
555@@ -192,6 +192,8 @@
556 void advance_buffer(
557 SurfaceId surf_id,
558 Surface& surface,
559+ graphics::Buffer* old_buffer,
560+ std::unique_lock<std::mutex>& lock,
561 std::function<void(graphics::Buffer*, graphics::BufferIpcMsgType)> complete);
562
563 virtual std::function<void(std::shared_ptr<Session> const&)> prompt_session_connect_handler() const;
564
565=== modified file 'src/server/frontend/surface_tracker.cpp'
566--- src/server/frontend/surface_tracker.cpp 2015-01-21 07:34:50 +0000
567+++ src/server/frontend/surface_tracker.cpp 2015-03-24 12:55:40 +0000
568@@ -1,5 +1,5 @@
569 /*
570- * Copyright © 2013 Canonical Ltd.
571+ * Copyright © 2013-2015 Canonical Ltd.
572 *
573 * This program is free software: you can redistribute it and/or modify
574 * it under the terms of the GNU General Public License version 3 as
575@@ -17,8 +17,11 @@
576 */
577
578 #include "surface_tracker.h"
579+#include "client_buffer_tracker.h"
580+
581 #include "mir/graphics/buffer.h"
582 #include "mir/graphics/buffer_id.h"
583+
584 #include <boost/throw_exception.hpp>
585 #include <stdexcept>
586
587@@ -32,6 +35,7 @@
588
589 bool mf::SurfaceTracker::track_buffer(SurfaceId surface_id, mg::Buffer* buffer)
590 {
591+ std::lock_guard<decltype(mutex)> lock{mutex};
592 auto& tracker = client_buffer_tracker[surface_id];
593 if (!tracker)
594 tracker = std::make_shared<ClientBufferTracker>(client_cache_size);
595@@ -53,6 +57,7 @@
596
597 void mf::SurfaceTracker::remove_surface(SurfaceId surface_id)
598 {
599+ std::lock_guard<decltype(mutex)> lock{mutex};
600 auto it = client_buffer_tracker.find(surface_id);
601 if (it != client_buffer_tracker.end())
602 client_buffer_tracker.erase(it);
603@@ -64,6 +69,7 @@
604
605 mg::Buffer* mf::SurfaceTracker::last_buffer(SurfaceId surface_id) const
606 {
607+ std::lock_guard<decltype(mutex)> lock{mutex};
608 auto it = client_buffer_resource.find(surface_id);
609 if (it != client_buffer_resource.end())
610 return it->second;
611@@ -74,6 +80,7 @@
612
613 mg::Buffer* mf::SurfaceTracker::buffer_from(mg::BufferID buffer_id) const
614 {
615+ std::lock_guard<decltype(mutex)> lock{mutex};
616 for (auto const& tracker : client_buffer_tracker)
617 {
618 auto buffer = tracker.second->buffer_from(buffer_id);
619
620=== modified file 'src/server/frontend/surface_tracker.h'
621--- src/server/frontend/surface_tracker.h 2015-01-21 07:34:50 +0000
622+++ src/server/frontend/surface_tracker.h 2015-03-24 12:55:40 +0000
623@@ -1,5 +1,5 @@
624 /*
625- * Copyright © 2013 Canonical Ltd.
626+ * Copyright © 2013-2015 Canonical Ltd.
627 *
628 * This program is free software: you can redistribute it and/or modify
629 * it under the terms of the GNU General Public License version 3 as
630@@ -20,10 +20,12 @@
631 #define MIR_FRONTEND_SURFACE_TRACKER_H_
632
633 #include "mir/frontend/surface_id.h"
634-#include "client_buffer_tracker.h"
635+#include "mir/graphics/buffer_id.h"
636+
637 #include <unordered_map>
638 #include <tuple>
639 #include <memory>
640+#include <mutex>
641
642 namespace mir
643 {
644@@ -33,7 +35,7 @@
645 }
646 namespace frontend
647 {
648-
649+class ClientBufferTracker;
650 class SurfaceTracker
651 {
652 public:
653@@ -65,6 +67,7 @@
654 /* accesses the last buffer given to track_buffer() for the given SurfaceId */
655 graphics::Buffer* last_buffer(SurfaceId) const;
656 private:
657+ mutable std::mutex mutex;
658 std::unordered_map<SurfaceId, graphics::Buffer*> client_buffer_resource;
659 };
660
661
662=== modified file 'src/server/graphics/software_cursor.cpp'
663--- src/server/graphics/software_cursor.cpp 2015-01-21 09:03:53 +0000
664+++ src/server/graphics/software_cursor.cpp 2015-03-24 12:55:40 +0000
665@@ -127,8 +127,11 @@
666 // Do a lock dance to make this function threadsafe,
667 // while avoiding calling scene methods under lock
668 {
669+ geom::Point position{0,0};
670 std::lock_guard<std::mutex> lg{guard};
671- new_renderable = create_renderable_for(cursor_image);
672+ if (renderable)
673+ position = renderable->screen_position().top_left;
674+ new_renderable = create_renderable_for(cursor_image, position);
675 }
676
677 // Add the new renderable first, then remove the old one to avoid
678@@ -148,26 +151,11 @@
679 }
680
681 std::shared_ptr<mg::detail::CursorRenderable>
682-mg::SoftwareCursor::create_renderable_for(CursorImage const& cursor_image)
683+mg::SoftwareCursor::create_renderable_for(CursorImage const& cursor_image, geom::Point position)
684 {
685- std::shared_ptr<detail::CursorRenderable> new_renderable;
686-
687- // Reuse buffer if possible, to minimize buffer reallocations
688- if (renderable && renderable->buffer()->size() == cursor_image.size())
689- {
690- new_renderable = std::make_shared<detail::CursorRenderable>(
691- renderable->buffer(),
692- renderable->screen_position().top_left + hotspot -
693- cursor_image.hotspot());
694- }
695- else
696- {
697- auto const buffer = allocator->alloc_buffer(
698- {cursor_image.size(), format, mg::BufferUsage::software});
699- new_renderable = std::make_shared<detail::CursorRenderable>(
700- buffer,
701- geom::Point{0,0} - cursor_image.hotspot());
702- }
703+ auto new_renderable = std::make_shared<detail::CursorRenderable>(
704+ allocator->alloc_buffer({cursor_image.size(), format, mg::BufferUsage::software}),
705+ position + hotspot - cursor_image.hotspot());
706
707 size_t const pixels_size =
708 cursor_image.size().width.as_uint32_t() *
709
710=== modified file 'src/server/graphics/software_cursor.h'
711--- src/server/graphics/software_cursor.h 2015-01-13 13:23:21 +0000
712+++ src/server/graphics/software_cursor.h 2015-03-24 12:55:40 +0000
713@@ -51,7 +51,7 @@
714
715 private:
716 std::shared_ptr<detail::CursorRenderable> create_renderable_for(
717- CursorImage const& cursor_image);
718+ CursorImage const& cursor_image, geometry::Point position);
719
720 std::shared_ptr<GraphicBufferAllocator> const allocator;
721 std::shared_ptr<input::Scene> const scene;
722
723=== modified file 'tests/acceptance-tests/throwback/test_client_input.cpp'
724--- tests/acceptance-tests/throwback/test_client_input.cpp 2015-02-02 12:18:18 +0000
725+++ tests/acceptance-tests/throwback/test_client_input.cpp 2015-03-24 12:55:40 +0000
726@@ -270,7 +270,7 @@
727 mis::a_key_down_event().of_scancode(KEY_4));
728 }
729
730-TEST_F(TestClientInput, clients_receive_pointer_inside_window)
731+TEST_F(TestClientInput, clients_receive_pointer_inside_window_and_crossing_events)
732 {
733 using namespace testing;
734
735@@ -284,7 +284,8 @@
736 handle_input(
737 mt::PointerEventWithPosition(
738 InputClient::surface_width - 1,
739- InputClient::surface_height - 1)))
740+ InputClient::surface_height - 1)));
741+ EXPECT_CALL(client.handler, handle_input(mt::PointerLeaveEvent()))
742 .WillOnce(mt::WakeUp(&client.all_events_received));
743 // But we should not receive an event for the second movement outside of our surface!
744
745
746=== modified file 'tests/unit-tests/frontend/test_protobuf_message_processor.cpp'
747--- tests/unit-tests/frontend/test_protobuf_message_processor.cpp 2015-01-29 04:34:12 +0000
748+++ tests/unit-tests/frontend/test_protobuf_message_processor.cpp 2015-03-24 12:55:40 +0000
749@@ -87,6 +87,7 @@
750 mt::fake_shared(stub_msg_sender),
751 mt::fake_shared(stub_display_server),
752 mt::fake_shared(stub_report));
753+ std::shared_ptr<mfd::MessageProcessor> mp = mt::fake_shared(pb_message_processor);
754
755 mpw::Invocation raw_invocation;
756 mp::BufferRequest buffer_request;
757@@ -97,7 +98,6 @@
758 mfd::Invocation invocation(raw_invocation);
759
760 std::vector<mir::Fd> fds;
761- mfd::MessageProcessor* mp = &pb_message_processor;
762 mp->dispatch(invocation, fds);
763
764 ASSERT_THAT(stub_display_server.exchange_buffer_response, testing::Ne(nullptr));
765
766=== modified file 'tests/unit-tests/graphics/android/test_hwc_configuration.cpp'
767--- tests/unit-tests/graphics/android/test_hwc_configuration.cpp 2015-01-22 09:00:14 +0000
768+++ tests/unit-tests/graphics/android/test_hwc_configuration.cpp 2015-03-24 12:55:40 +0000
769@@ -128,7 +128,10 @@
770 TEST_F(HwcConfiguration, queries_connected_primary_display_properties)
771 {
772 using namespace testing;
773- geom::Size px_size {343, 254};
774+ auto android_reported_dpi_x = 390000u;
775+ auto android_reported_dpi_y = 400000u;
776+ geom::Size px_size {768, 1280};
777+ geom::Size mm_size {50, 81};
778
779 std::vector<mga::ConfigId> hwc_config {mga::ConfigId{0xA1}, mga::ConfigId{0xBEE}};
780 std::chrono::milliseconds vrefresh_period {16};
781@@ -153,6 +156,12 @@
782 case HWC_DISPLAY_VSYNC_PERIOD:
783 values[i] = std::chrono::duration_cast<std::chrono::nanoseconds>(vrefresh_period).count();
784 break;
785+ case HWC_DISPLAY_DPI_X:
786+ values[i] = android_reported_dpi_x;
787+ break;
788+ case HWC_DISPLAY_DPI_Y:
789+ values[i] = android_reported_dpi_y;
790+ break;
791 default:
792 break;
793 }
794@@ -165,6 +174,7 @@
795 auto vrefresh_hz = 1000.0 / vrefresh_period.count();
796 auto attribs = config.active_attribs_for(display);
797 EXPECT_THAT(attribs.pixel_size, Eq(px_size));
798+ EXPECT_THAT(attribs.mm_size, Eq(mm_size));
799 EXPECT_THAT(attribs.vrefresh_hz, Eq(vrefresh_hz));
800 EXPECT_TRUE(attribs.connected);
801 }
802@@ -188,24 +198,29 @@
803 TEST_F(HwcConfiguration, no_fpe_from_malformed_refresh)
804 {
805 using namespace testing;
806- EXPECT_CALL(*mock_hwc_wrapper, display_attributes( _, _, _, _))
807+ EXPECT_CALL(*mock_hwc_wrapper, display_attributes(_,_,_,_))
808 .WillOnce(Invoke([]
809 (mga::DisplayName, mga::ConfigId, uint32_t const* attribute_list, int32_t* values)
810 {
811 int i = 0;
812 while(attribute_list[i] != HWC_DISPLAY_NO_ATTRIBUTE)
813- {
814- switch(attribute_list[i])
815- {
816- case HWC_DISPLAY_VSYNC_PERIOD:
817- values[i] = 0;
818- break;
819- default:
820- break;
821- }
822- i++;
823- }
824+ values[i++] = 0;
825 }));
826 auto attribs = config.active_attribs_for(mga::DisplayName::external);
827 EXPECT_THAT(attribs.vrefresh_hz, Eq(0.0f));
828 }
829+
830+TEST_F(HwcConfiguration, no_fpe_from_malformed_dpi)
831+{
832+ using namespace testing;
833+ EXPECT_CALL(*mock_hwc_wrapper, display_attributes(_,_,_,_))
834+ .WillOnce(Invoke([]
835+ (mga::DisplayName, mga::ConfigId, uint32_t const* attribute_list, int32_t* values)
836+ {
837+ int i = 0;
838+ while(attribute_list[i] != HWC_DISPLAY_NO_ATTRIBUTE)
839+ values[i++] = 0;
840+ }));
841+ auto attribs = config.active_attribs_for(mga::DisplayName::external);
842+ EXPECT_THAT(attribs.mm_size, Eq(geom::Size{0,0}));
843+}
844
845=== modified file 'tests/unit-tests/graphics/test_software_cursor.cpp'
846--- tests/unit-tests/graphics/test_software_cursor.cpp 2015-01-13 13:23:21 +0000
847+++ tests/unit-tests/graphics/test_software_cursor.cpp 2015-03-24 12:55:40 +0000
848@@ -274,3 +274,23 @@
849
850 cursor.show(another_stub_cursor_image);
851 }
852+
853+//lp: #1413211
854+TEST_F(SoftwareCursor, new_buffer_on_each_show)
855+{
856+ struct MockBufferAllocator : public mg::GraphicBufferAllocator
857+ {
858+ MOCK_METHOD1(alloc_buffer, std::shared_ptr<mg::Buffer>(mg::BufferProperties const&));
859+ std::vector<MirPixelFormat> supported_pixel_formats() { return {mir_pixel_format_abgr_8888}; }
860+ } mock_allocator;
861+
862+ EXPECT_CALL(mock_allocator, alloc_buffer(testing::_))
863+ .Times(3)
864+ .WillRepeatedly(testing::Return(std::make_shared<mtd::StubBuffer>()));;
865+ mg::SoftwareCursor cursor{
866+ mt::fake_shared(mock_allocator),
867+ mt::fake_shared(mock_input_scene)};
868+ cursor.show(another_stub_cursor_image);
869+ cursor.show(another_stub_cursor_image);
870+ cursor.show(stub_cursor_image);
871+}
872
873=== modified file 'tests/unit-tests/test_fatal.cpp'
874--- tests/unit-tests/test_fatal.cpp 2015-01-21 07:34:50 +0000
875+++ tests/unit-tests/test_fatal.cpp 2015-03-24 12:55:40 +0000
876@@ -24,7 +24,7 @@
877
878 using namespace testing;
879
880-TEST(FatalTest, abort_formats_message_to_stderr)
881+TEST(FatalErrorDeathTest, abort_formats_message_to_stderr)
882 {
883 mir::FatalErrorStrategy on_error{mir::fatal_error_abort};
884
885@@ -32,7 +32,7 @@
886 "Mary had 1 little lamb");
887 }
888
889-TEST(FatalTest, abort_raises_sigabrt)
890+TEST(FatalErrorDeathTest, abort_raises_sigabrt)
891 {
892 mir::FatalErrorStrategy on_error{mir::fatal_error_abort};
893
894@@ -41,7 +41,7 @@
895 "Hello world");
896 }
897
898-TEST(FatalTest, throw_formats_message_to_what)
899+TEST(FatalErrorTest, throw_formats_message_to_what)
900 {
901 EXPECT_THROW(
902 mir::fatal_error("%s had %d %s %s", "Mary", 1, "little", "lamb"),
903
904=== modified file 'tools/valgrind_suppressions_armhf'
905--- tools/valgrind_suppressions_armhf 2015-01-27 03:02:22 +0000
906+++ tools/valgrind_suppressions_armhf 2015-03-24 12:55:40 +0000
907@@ -60,6 +60,33 @@
908 ...
909 }
910
911+{
912+ libc_udivmoddi4_cond
913+ Memcheck:Cond
914+ fun:__udivmoddi4
915+}
916+
917+{
918+ libc_udivmoddi4_value4
919+ Memcheck:Value4
920+ fun:__udivmoddi4
921+}
922+
923+# It's unfortunate that we need these, since they will
924+# suppress errors Addr4 and Value4 from libc regardless
925+# of call depth
926+{
927+ libc_addr4
928+ Memcheck:Addr4
929+ obj:/lib/arm-linux-gnueabihf/libc-2.*.so
930+}
931+
932+{
933+ libc_value4
934+ Memcheck:Value4
935+ obj:/lib/arm-linux-gnueabihf/libc-2.*.so
936+}
937+
938 # libgcc_s
939
940 {
941
942=== added file 'tools/valgrind_suppressions_glibc_2.21'
943--- tools/valgrind_suppressions_glibc_2.21 1970-01-01 00:00:00 +0000
944+++ tools/valgrind_suppressions_glibc_2.21 2015-03-24 12:55:40 +0000
945@@ -0,0 +1,1404 @@
946+# This is a generated file, composed of the following suppression rules:
947+# exp-sgcheck.supp xfree-3.supp xfree-4.supp glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.X.supp
948+{
949+ ld-2.X possibly applying relocations
950+ exp-sgcheck:SorG
951+ obj:*/*lib*/ld-2.*so*
952+ obj:*/*lib*/ld-2.*so*
953+}
954+
955+# I'm pretty sure this is a false positive caused by the sg_ stuff
956+{
957+ glibc realpath false positive
958+ exp-sgcheck:SorG
959+ fun:realpath
960+ fun:*
961+}
962+
963+{
964+ I think this is glibc's ultra optimised getenv doing 2 byte reads
965+ exp-sgcheck:SorG
966+ fun:getenv
967+}
968+
969+##----------------------------------------------------------------------##
970+
971+# Errors to suppress by default with XFree86 3.3.6)
972+
973+# Format of this file is:
974+# {
975+# name_of_suppression
976+# tool_name:supp_kind
977+# (optional extra info for some suppression types)
978+# caller0 name, or /name/of/so/file.so
979+# caller1 name, or ditto
980+# (optionally: caller2 name)
981+# (optionally: caller3 name)
982+# }
983+#
984+# For Memcheck, the supp_kinds are:
985+#
986+# Param Value1 Value2 Value4 Value8 Value16 Jump
987+# Free Addr1 Addr2 Addr4 Addr8 Addr16
988+# Cond (previously known as Value0)
989+#
990+# and the optional extra info is:
991+# if Param: name of system call param
992+
993+##----------------------------------------------------------------------##
994+
995+{
996+ X11-Cond-0
997+ Memcheck:Cond
998+ obj:*libXt.so.6.0
999+ obj:*libXt.so.6.0
1000+ obj:*libXt.so.6.0
1001+}
1002+{
1003+ X11-Cond-1
1004+ Memcheck:Cond
1005+ fun:__rawmemchr
1006+ obj:*libXt.so.6.0
1007+ obj:*libXt.so.6.0
1008+}
1009+
1010+
1011+# Suppressions for XFree86-3.3.X
1012+
1013+{
1014+ X11-Addr4-1
1015+ Memcheck:Addr4
1016+ obj:/usr/X11R6/lib/libX11.so.6.1
1017+ obj:/usr/X11R6/lib/libX11.so.6.1
1018+ obj:/usr/X11R6/lib/libX11.so.6.1
1019+}
1020+
1021+{
1022+ X11-Addr4-2
1023+ Memcheck:Addr4
1024+ obj:/usr/X11R6/lib/libX11.so.6.1
1025+ obj:/usr/X11R6/lib/libX11.so.6.1
1026+ obj:/usr/X11R6/lib/libXt.so.6.0
1027+}
1028+
1029+{
1030+ X11-Addr4-3
1031+ Memcheck:Addr4
1032+ obj:/usr/X11R6/lib/libXt.so.6.0
1033+ obj:/usr/X11R6/lib/libXt.so.6.0
1034+ obj:/usr/X11R6/lib/libXt.so.6.0
1035+}
1036+
1037+{
1038+ X11-Addr4-4
1039+ Memcheck:Addr4
1040+ obj:/usr/X11R6/lib/libX11.so.6.1
1041+ obj:/usr/X11R6/lib/libXt.so.6.0
1042+ obj:/usr/X11R6/lib/libXt.so.6.0
1043+}
1044+
1045+{
1046+ X11-Addr4-5
1047+ Memcheck:Addr4
1048+ fun:__rawmemchr
1049+ obj:/usr/X11R6/lib/libXt.so.6.0
1050+ obj:/usr/X11R6/lib/libXt.so.6.0
1051+}
1052+
1053+{
1054+ X11-Addr4-6
1055+ Memcheck:Addr4
1056+ obj:/usr/X11R6/lib/libXmu.so.6.0
1057+ obj:/usr/X11R6/lib/libXmu.so.6.0
1058+ obj:/usr/X11R6/lib/libXt.so.6.0
1059+}
1060+
1061+{
1062+ X11-Addr4-7
1063+ Memcheck:Addr4
1064+ obj:/usr/X11R6/lib/libXt.so.6.0
1065+ obj:/usr/X11R6/lib/libXt.so.6.0
1066+ obj:/usr/X11R6/lib/libXawXpm_posing_as_Xaw.so.6.1
1067+}
1068+
1069+{
1070+ X11-Param-1
1071+ Memcheck:Param
1072+ write(buf)
1073+ fun:__libc_write
1074+ obj:/usr/X11R6/lib/libX11.so.6.1
1075+ obj:/usr/X11R6/lib/libX11.so.6.1
1076+}
1077+
1078+{
1079+ X11-Addr4-8
1080+ Memcheck:Addr4
1081+ obj:/usr/X11R6/lib/libX11.so.6.1
1082+ obj:/usr/X11R6/lib/libXpm.so.4.11
1083+ obj:/usr/X11R6/lib/libXpm.so.4.11
1084+}
1085+
1086+{
1087+ X11-Addr4-8
1088+ Memcheck:Addr4
1089+ obj:/usr/X11R6/lib/libXt.so.6.0
1090+ obj:/usr/X11R6/lib/libXawXpm_posing_as_Xaw.so.6.1
1091+ obj:/usr/X11R6/lib/libXt.so.6.0
1092+}
1093+
1094+{
1095+ X11-Addr4-9
1096+ Memcheck:Addr4
1097+ obj:/usr/X11R6/lib/libXaw.so.6.1
1098+ obj:/usr/X11R6/lib/libXt.so.6.0
1099+ obj:/usr/X11R6/lib/libXt.so.6.0
1100+}
1101+
1102+{
1103+ X11-Addr4-10
1104+ Memcheck:Addr4
1105+ obj:/usr/X11R6/lib/libXaw.so.6.1
1106+ obj:/usr/X11R6/lib/libXaw.so.6.1
1107+ obj:/usr/X11R6/lib/libXt.so.6.0
1108+}
1109+
1110+{
1111+ X11-Addr4-11
1112+ Memcheck:Addr4
1113+ obj:/usr/X11R6/lib/libXt.so.6.0
1114+ obj:/usr/X11R6/lib/libXt.so.6.0
1115+ obj:/usr/X11R6/lib/libXaw.so.6.1
1116+}
1117+
1118+
1119+
1120+##----------------------------------------------------------------------##
1121+
1122+##----------------------------------------------------------------------##
1123+
1124+# Errors to suppress by default with XFree86 4.1.0)
1125+
1126+# *** And a bunch of other stuff which is completely unrelated
1127+# to X. The default suppressions are a bit of a mess and could do
1128+# with a good tidying up.
1129+
1130+# Format of this file is:
1131+# {
1132+# name_of_suppression
1133+# tool_name:supp_kind
1134+# (optional extra info for some suppression types)
1135+# caller0 name, or /name/of/so/file.so
1136+# caller1 name, or ditto
1137+# (optionally: caller2 name)
1138+# (optionally: caller3 name)
1139+# }
1140+#
1141+# For Memcheck, the supp_kinds are:
1142+#
1143+# Param Value1 Value2 Value4 Value8 Value16 Jump
1144+# Free Addr1 Addr2 Addr4 Addr8 Addr16
1145+# Cond (previously known as Value0)
1146+#
1147+# and the optional extra info is:
1148+# if Param: name of system call param
1149+
1150+# Resulting from R H 8.0
1151+{
1152+ *libc_write/libX11.so.6.2/*X11TransWrite(Param)
1153+ Memcheck:Param
1154+ write(buf)
1155+ fun:*libc_write
1156+ obj:/usr/*lib*/libX11.so*
1157+ fun:*X11TransWrite
1158+}
1159+
1160+{
1161+ libX11.so.6.2/libX11.so.6.2/libX11.so.6.2(Cond)
1162+ Memcheck:Cond
1163+ obj:/usr/*lib*/libX11.so*
1164+ obj:/usr/*lib*/libX11.so*
1165+ obj:/usr/*lib*/libX11.so*
1166+}
1167+
1168+{
1169+ libXt.so.6.2/libXt.so.6.2/libXt.so.6.2(Cond)
1170+ Memcheck:Cond
1171+ obj:/usr/*lib*/libXt.so*
1172+ obj:/usr/*lib*/libXt.so*
1173+ obj:/usr/*lib*/libXt.so*
1174+}
1175+
1176+
1177+{
1178+ libXaw.so.7.0/libXaw.so.7.0/libXaw.so.7.0(Cond)
1179+ Memcheck:Cond
1180+ obj:/usr/*lib*/libXaw.so*
1181+ obj:/usr/*lib*/libXaw.so*
1182+ obj:/usr/*lib*/libXaw.so*
1183+}
1184+
1185+{
1186+ libXmu.so.6.2/libXmu.so.6.2/libXmu.so.6.2(Cond)
1187+ Memcheck:Cond
1188+ obj:/usr/*lib*/libXmu.so*
1189+ obj:/usr/*lib*/libXmu.so*
1190+ obj:/usr/*lib*/libXmu.so*
1191+}
1192+
1193+{
1194+ libXt.so.6.0/libXt.so.6.0/libXaw.so.7.0(Cond)
1195+ Memcheck:Cond
1196+ obj:/usr/*lib*/libXt.so*
1197+ obj:/usr/*lib*/libXt.so*
1198+ obj:/usr/*lib*/libXaw.so*
1199+}
1200+
1201+{
1202+ libXaw.so.7.0/libXaw.so.7.0/libXt.so.6.0(Value4)
1203+ Memcheck:Value4
1204+ obj:/usr/*lib*/libXaw.so*
1205+ obj:/usr/*lib*/libXaw.so*
1206+ obj:/usr/*lib*/libXt.so*
1207+}
1208+
1209+{
1210+ libXaw.so.7.0/libXaw.so.7.0/libXt.so.6.0(Cond)
1211+ Memcheck:Cond
1212+ obj:/usr/*lib*/libXaw.so*
1213+ obj:/usr/*lib*/libXaw.so*
1214+ obj:/usr/*lib*/libXt.so*
1215+}
1216+
1217+{
1218+ libX11.so.6.2/libX11.so.6.2/libXaw.so.7.0(Cond)
1219+ Memcheck:Cond
1220+ obj:/usr/*lib*/libX11.so*
1221+ obj:/usr/*lib*/libX11.so*
1222+ obj:/usr/*lib*/libXaw.so*
1223+}
1224+
1225+{
1226+ libX11.so.6.2/libX11.so.6.2/libXaw.so.7.0(Addr4)
1227+ Memcheck:Addr4
1228+ obj:/usr/*lib*/libX11.so*
1229+ obj:/usr/*lib*/libX11.so*
1230+ obj:/usr/*lib*/libXaw.so*
1231+}
1232+
1233+{
1234+ libX11.so.6.2/libXaw.so.7.0/libXaw.so.7.0(Cond)
1235+ Memcheck:Cond
1236+ obj:/usr/*lib*/libX11.so*
1237+ obj:/usr/*lib*/libXaw.so*
1238+ obj:/usr/*lib*/libXaw.so*
1239+}
1240+
1241+{
1242+ libXpm.so.4.11/libXpm.so.4.11/libXpm.so.4.11
1243+ Memcheck:Cond
1244+ obj:/usr/*lib*/libXpm.so.4.11
1245+ obj:/usr/*lib*/libXpm.so.4.11
1246+ obj:/usr/*lib*/libXpm.so.4.11
1247+}
1248+
1249+{
1250+ struct with uninitialized paddings
1251+ Memcheck:Param
1252+ writev(vector[...])
1253+ fun:*_writev
1254+ fun:_X11TransSocketWritev
1255+ fun:_X11TransWritev
1256+ fun:*
1257+}
1258+
1259+{
1260+ struct with uninitialized paddings - libxcb
1261+ Memcheck:Param
1262+ writev(vector[...])
1263+ obj:/lib*/*.so
1264+ obj:/usr/lib*/libxcb.so.1.0.0
1265+ obj:/usr/lib*/libxcb.so.1.0.0
1266+ fun:xcb_send_request
1267+ fun:_X*
1268+}
1269+
1270+{
1271+ struct with uninitialized paddings - libxcb
1272+ Memcheck:Param
1273+ writev(vector[...])
1274+ obj:/lib*/*.so
1275+ obj:/usr/lib*/libxcb.so.1.0.0
1276+ obj:/usr/lib*/libxcb.so.1.0.0
1277+ obj:/usr/lib*/libxcb.so.1.0.0
1278+ fun:xcb_*
1279+ fun:_X*
1280+}
1281+
1282+{
1283+ another struct with uninitialized paddings
1284+ Memcheck:Param
1285+ write(buf)
1286+ obj:*
1287+ fun:_IceTransSocketWrite
1288+ fun:_IceTransWrite
1289+ fun:_IceWrite
1290+}
1291+
1292+{
1293+ Xorg 6.8.1 uninit _write* padding
1294+ Memcheck:Param
1295+ write(buf)
1296+ fun:*
1297+ fun:_X11TransWrite
1298+ obj:/usr/*lib*/libX11.so*
1299+}
1300+
1301+{
1302+ Xorg 6.8.1 uninit write padding
1303+ Memcheck:Param
1304+ write(buf)
1305+ fun:write
1306+ fun:_X11TransWrite
1307+ obj:/usr/*lib*/libX11.so*
1308+}
1309+
1310+{
1311+ Xorg 6.8.1 ICE uninit __write* padding
1312+ Memcheck:Param
1313+ write(buf)
1314+ obj:*
1315+ fun:_IceTransWrite
1316+ fun:_IceWrite
1317+ fun:IceFlush
1318+}
1319+
1320+{
1321+ Xorg 6.8.1 writev uninit padding
1322+ Memcheck:Param
1323+ writev(vector[...])
1324+ fun:writev
1325+ obj:/usr/*lib*/libX11.so*
1326+ fun:_X11TransWritev
1327+ fun:_XSend
1328+}
1329+
1330+{
1331+ Xorg 6.9.0 writev uninit padding
1332+ Memcheck:Param
1333+ writev(vector[...])
1334+ fun:do_writev
1335+ fun:writev
1336+ obj:/usr/*lib*/libX11.so*
1337+ fun:_X11TransWritev
1338+ fun:_XSend
1339+}
1340+
1341+{
1342+ X on SUSE11 writev uninit padding
1343+ Memcheck:Param
1344+ writev(vector[...])
1345+ fun:writev
1346+ obj:/usr/lib*/libxcb.so*
1347+ obj:/usr/lib*/libxcb.so*
1348+}
1349+{
1350+ X on SUSE11 writev uninit padding 2
1351+ Memcheck:Param
1352+ writev(vector[...])
1353+ obj:/lib*/ld-2.*.so*
1354+ obj:/usr/lib*/libxcb.so*
1355+ obj:/usr/lib*/libxcb.so*
1356+}
1357+{
1358+ X on SUSE11 writev uninit padding 3
1359+ Memcheck:Param
1360+ writev(vector[...])
1361+ obj:/lib*/ld-2.*.so*
1362+ obj:/usr/lib*/libORBit*.so*
1363+ obj:/usr/lib*/libORBit*.so*
1364+}
1365+{
1366+ X on SUSE11 writev uninit padding 4
1367+ Memcheck:Param
1368+ writev(vector[...])
1369+ obj:/lib*/libc-2.*.so*
1370+ obj:/usr/lib*/libORBit*.so*
1371+ obj:/usr/lib*/libORBit*.so*
1372+}
1373+
1374+
1375+# There's something strange about a % 127 in XftFontOpenInfo
1376+# (hashing) which gcc turns into a multiply by 33818641 and
1377+# some other guff instead. I don't understand it enough to
1378+# know if libXft is broken or if memcheck's value tracking is
1379+# inadequate here. Anyway, for the moment, suppress it.
1380+#
1381+# Use of uninitialised value of size 8
1382+# at 0x71A59F8: XftFontOpenInfo (in /usr/X11R6/lib64/libXft.so.2.1.2)
1383+# by 0x71A5F0D: XftFontOpenPattern (in /usr/X11R6/lib64/libXft.so.2.1.2)
1384+# by 0x65F166E: loadFontConfigFont(QFontPrivate const*, QFontDef const&,
1385+# QFont::Script) (qfontdatabase_x11.cpp:1942)
1386+# by 0x65F5DE4: QFontDatabase::findFont(QFont::Script, QFontPrivate const*,
1387+# QFontDef const&, int) (qfontdatabase.cpp:996)
1388+{
1389+ XftFontOpenInfo-umod-127-strangeness
1390+ Memcheck:Value8
1391+ obj:/usr/X11*/lib*/libXft.so*
1392+ obj:/usr/X11*/lib*/libXft.so*
1393+}
1394+{
1395+ XftFontOpenInfo-umod-127-strangeness-a-la-xorg
1396+ Memcheck:Value8
1397+ obj:/usr/lib*/libXft.so*
1398+ obj:/usr/lib*/libXft.so*
1399+}
1400+
1401+{
1402+ More X padding stuff
1403+ Memcheck:Param
1404+ writev(vector[...])
1405+ fun:*writev*
1406+ obj:/usr/X11*/lib*/libX11.so*
1407+ obj:/usr/X11*/lib*/libX11.so*
1408+}
1409+
1410+# Inlined strlen in libX11 on Ubuntu 9.10 amd64, unfortunately.
1411+# Invalid read of size 4
1412+# at 0x9B5CCE6: ??? (in /usr/lib/libX11.so.6.2.0)
1413+# by 0x9B5D011: XGetAtomName (in /usr/lib/libX11.so.6.2.0)
1414+# by 0x86407C3: gdk_x11_xatom_to_atom_for_display
1415+# (in /usr/lib/libgdk-x11-2.0.so.0.1800.3)
1416+# by 0x8636817: ??? (in /usr/lib/libgdk-x11-2.0.so.0.1800.3)
1417+# Address 0x1a558e1c is 28 bytes inside a block of size 30 alloc'd
1418+# at 0x4C2552D: malloc (vg_replace_malloc.c:236)
1419+# by 0x9B642C0: _XUpdateAtomCache (in /usr/lib/libX11.so.6.2.0)
1420+# by 0x9B647F1: ??? (in /usr/lib/libX11.so.6.2.0)
1421+# by 0x9B81818: ??? (in /usr/lib/libX11.so.6.2.0)
1422+{
1423+ libX11.so.6.2.0/libX11.so.6.2.0(Addr4)
1424+ Memcheck:Addr4
1425+ obj:/usr/*lib*/libX11.so*
1426+ obj:/usr/*lib*/libX11.so*
1427+}
1428+
1429+##----------------------------------------------------------------------##
1430+# Completely inappropriate place, but ...
1431+
1432+{
1433+ ifort-9.X-on-i686-1
1434+ Memcheck:Addr4
1435+ fun:unaligned_bigint
1436+ fun:hash
1437+ fun:for__add_to_lf_table
1438+}
1439+{
1440+ ifort-9.X-on-amd64-1
1441+ Memcheck:Addr8
1442+ fun:unaligned_bigint
1443+ fun:hash
1444+ fun:for__add_to_lf_table
1445+}
1446+
1447+
1448+# zlib-1.2.x uses uninitialised memory in some tricky way which
1449+# apparently is harmless (it must amount to a vectorised while-loop,
1450+# nothing else makes sense). Fools Memcheck though. See the mentioned
1451+# URL for details.
1452+{
1453+ zlib-1.2.x trickyness (1a): See http://www.zlib.net/zlib_faq.html#faq36
1454+ Memcheck:Cond
1455+ obj:/*lib*/libz.so.1.2.*
1456+ ...
1457+ obj:/*lib*/libz.so.1.2.*
1458+ fun:deflate
1459+}
1460+{
1461+ zlib-1.2.x trickyness (1b): See http://www.zlib.net/zlib_faq.html#faq36
1462+ Memcheck:Cond
1463+ obj:/*lib*/libz.so.1.2.*
1464+ fun:deflate
1465+}
1466+
1467+{
1468+ zlib-1.2.x trickyness (2a): See http://www.zlib.net/zlib_faq.html#faq36
1469+ Memcheck:Value8
1470+ obj:/*lib*/libz.so.1.2.*
1471+ ...
1472+ obj:/*lib*/libz.so.1.2.*
1473+ fun:deflate
1474+}
1475+{
1476+ zlib-1.2.x trickyness (2b): See http://www.zlib.net/zlib_faq.html#faq36
1477+ Memcheck:Value8
1478+ obj:/*lib*/libz.so.1.2.*
1479+ fun:deflate
1480+}
1481+
1482+{
1483+ zlib-1.2.x trickyness (3a): See http://www.zlib.net/zlib_faq.html#faq36
1484+ Memcheck:Value4
1485+ obj:/*lib*/libz.so.1.2.*
1486+ ...
1487+ obj:/*lib*/libz.so.1.2.*
1488+ fun:deflate
1489+}
1490+{
1491+ zlib-1.2.x trickyness (3b): See http://www.zlib.net/zlib_faq.html#faq36
1492+ Memcheck:Value4
1493+ obj:/*lib*/libz.so.1.2.*
1494+ fun:deflate
1495+}
1496+
1497+
1498+##----------------------------------------------------------------------##
1499+
1500+## More general versions of some of the old X suppressions above
1501+{
1502+ Ubuntu804 libXaw.so.7.0/libXaw.so.7.0/libXaw.so.7.0(Cond)
1503+ Memcheck:Cond
1504+ obj:/usr/*lib*/libXaw*so*
1505+ obj:/usr/*lib*/libXaw*so*
1506+ obj:/usr/*lib*/libXaw*so*
1507+}
1508+{
1509+ Ubuntu804 libXaw.so.7.0/libXaw.so.7.0/libXt(Cond)
1510+ Memcheck:Cond
1511+ obj:/usr/*lib*/libXaw*so*
1512+ obj:/usr/*lib*/libXaw*so*
1513+ obj:/usr/*lib*/libXt*so*
1514+}
1515+
1516+{
1517+ Ubuntu804-hack-1
1518+ Memcheck:Overlap
1519+ fun:mempcpy
1520+ fun:_IO_default_xsputn
1521+ obj:/lib*/libc-2.*so*
1522+}
1523+#
1524+# Suppression patterns for ld, the dynamic loader.
1525+#
1526+
1527+# Suppress all data races triggered by ld.
1528+{
1529+ drd-ld
1530+ drd:ConflictingAccess
1531+ obj:*/lib*/ld-*.so
1532+}
1533+
1534+#
1535+# Suppression patterns for libc.
1536+#
1537+
1538+# Suppress all data races where the topmost frame is inside libc.so. Although
1539+# this could hide some real data races, unfortunately this is the only way to
1540+# not report any false positives on stdio functions. The glibc functions
1541+# manipulating FILE objects use locking primitives that cannot be intercepted
1542+# easily. See also the definitions of _IO_lock_lock() etc. in the file
1543+# nptl/sysdeps/pthread/bits/stdio-lock.h in the glibc source tree.
1544+{
1545+ drd-libc-stdio
1546+ drd:ConflictingAccess
1547+ obj:*/lib*/libc-*
1548+}
1549+{
1550+ drd-libc-thread-cancellation-test
1551+ drd:ConflictingAccess
1552+ fun:write
1553+}
1554+{
1555+ drd-libc-random
1556+ drd:ConflictingAccess
1557+ fun:random_r
1558+ fun:random
1559+}
1560+
1561+#
1562+# Suppression patterns for libstdc++, the implementation of the standard C++
1563+# library included with the gcc compiler.
1564+#
1565+# Note: several versions of the libstdc++ library (4.2.2, 4.3.2, 4.4.0, 4.5.0
1566+# and their predecessors) contain an implementation of the std::string class
1567+# that triggers conflicting memory accesses. See also
1568+# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40518
1569+#
1570+
1571+# {
1572+# drd-libstdc++-std::string::string()
1573+# drd:ConflictingAccess
1574+# fun:_ZNSsC1ERKSs
1575+# }
1576+
1577+{
1578+ drd-libstdc++-cxa_guard_release
1579+ drd:CondErr
1580+ fun:pthread_cond_broadcast@*
1581+ fun:__cxa_guard_release
1582+}
1583+
1584+
1585+#
1586+# Suppression patterns for libpthread.
1587+#
1588+
1589+{
1590+ drd-libpthread-pthread_create
1591+ drd:ConflictingAccess
1592+ ...
1593+ fun:pthread_create*
1594+}
1595+{
1596+ drd-libpthread-pthread_join
1597+ drd:ConflictingAccess
1598+ fun:pthread_join
1599+ fun:pthread_join
1600+}
1601+{
1602+ drd-libpthread-__deallocate_stack
1603+ drd:ConflictingAccess
1604+ ...
1605+ fun:__deallocate_stack
1606+}
1607+{
1608+ drd-libpthread-__free_stacks
1609+ drd:ConflictingAccess
1610+ fun:__free_stacks
1611+}
1612+{
1613+ drd-libpthread-__free_tcb
1614+ drd:ConflictingAccess
1615+ ...
1616+ fun:__free_tcb
1617+}
1618+{
1619+ drd-libpthread-__nptl_deallocate_tsd
1620+ drd:ConflictingAccess
1621+ fun:__nptl_deallocate_tsd
1622+}
1623+{
1624+ drd-libpthread-pthread_detach
1625+ drd:ConflictingAccess
1626+ fun:pthread_detach
1627+ fun:pthread_detach
1628+}
1629+{
1630+ drd-libpthread-pthread_once
1631+ drd:ConflictingAccess
1632+ fun:pthread_once
1633+}
1634+{
1635+ drd-libpthread-pthread_cancel_init
1636+ drd:ConflictingAccess
1637+ fun:pthread_cancel_init
1638+}
1639+{
1640+ drd-libpthread-_Unwind_ForcedUnwind
1641+ drd:ConflictingAccess
1642+ ...
1643+ fun:_Unwind_ForcedUnwind
1644+}
1645+{
1646+ drd-libpthread-_Unwind_GetCFA
1647+ drd:ConflictingAccess
1648+ fun:_Unwind_GetCFA
1649+}
1650+{
1651+ drd-libpthread-_Unwind_Resume
1652+ drd:ConflictingAccess
1653+ ...
1654+ fun:_Unwind_Resume
1655+}
1656+{
1657+ drd-libpthread-?
1658+ drd:ConflictingAccess
1659+ obj:*/lib/libgcc_s.so.1
1660+}
1661+{
1662+ drd-libpthread-nanosleep
1663+ drd:ConflictingAccess
1664+ fun:nanosleep
1665+}
1666+
1667+#
1668+# Suppression patterns for libgomp.
1669+#
1670+
1671+# Unfortunately many statements in libgomp trigger conflicting accesses. It is
1672+# not clear to me which of these are safe and which ones not. See also
1673+# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40362
1674+{
1675+ drd-libgomp
1676+ drd:ConflictingAccess
1677+ obj:/usr/lib*/libgomp.so*
1678+}
1679+
1680+#
1681+# Suppression patterns for libX11.
1682+#
1683+
1684+{
1685+ drd-libX11-XCreateFontSet
1686+ drd:CondErr
1687+ fun:pthread_cond_init*
1688+ fun:_XReply
1689+ fun:XListFontsWithInfo
1690+ obj:/usr/lib*/libX11.so*
1691+ fun:XCreateOC
1692+ fun:XCreateFontSet
1693+}
1694+
1695+#
1696+# Suppression patterns for libxcb.
1697+#
1698+
1699+{
1700+ drd-libxcb-xcb_wait_for_reply
1701+ drd:CondErr
1702+ ...
1703+ fun:pthread_cond_destroy*
1704+ fun:xcb_wait_for_reply
1705+}
1706+
1707+#
1708+# Suppression patterns for libglib.
1709+#
1710+
1711+{
1712+ drd-libglib-access-g_threads_got_initialized
1713+ drd:ConflictingAccess
1714+ ...
1715+ fun:g_slice_alloc
1716+ fun:g_ptr_array_sized_new
1717+}
1718+{
1719+ drd-libglib-access-g_threads_got_initialized
1720+ drd:ConflictingAccess
1721+ ...
1722+ fun:_ZN27QEventDispatcherGlibPrivateC1EP13_GMainContext
1723+ fun:_ZN20QEventDispatcherGlibC1EP7QObject
1724+ obj:/usr/lib*/libQtCore.so.4.*
1725+ obj:/usr/lib*/libQtCore.so.4.*
1726+}
1727+{
1728+ drd-libglib-access-g_mem_initialized
1729+ drd:ConflictingAccess
1730+ fun:g_malloc0
1731+}
1732+{
1733+ drd-libglib-g_private_get_posix_impl
1734+ drd:ConflictingAccess
1735+ fun:g_private_get_posix_impl
1736+}
1737+{
1738+ drd-libglib-g_private_set_posix_impl
1739+ drd:ConflictingAccess
1740+ fun:g_private_set_posix_impl
1741+}
1742+{
1743+ drd-libglib-g_get_language_names
1744+ drd:ConflictingAccess
1745+ fun:g_slice_free_chain_with_offset
1746+}
1747+{
1748+ drd-libglib-g_main_context_new
1749+ drd:ConflictingAccess
1750+ fun:fcntl
1751+ obj:/usr/lib*/libglib-*.so*
1752+ fun:g_main_context_new
1753+}
1754+
1755+#
1756+# Suppression patterns for libQtCore.
1757+#
1758+
1759+{
1760+ drd-libQtCore-deref-that-calls-QThreadData-destructor
1761+ drd:ConflictingAccess
1762+ fun:_ZN11QThreadDataD1Ev
1763+ obj:/usr/lib*/libQtCore.so.4.*
1764+}
1765+{
1766+ drd-libQtCore-4.0/4.1-Q_GLOBAL_STATIC-connectionList
1767+ drd:ConflictingAccess
1768+ obj:/usr/lib*/libQtCore.so.4.*
1769+ fun:_ZN11QMetaObject8activateEP7QObjectiiPPv
1770+ fun:_ZN11QMetaObject8activateEP7QObjectPKS_iPPv
1771+}
1772+{
1773+ drd-libQtCore-QObjectPrivate::clearGuards(QObject*)
1774+ drd:ConflictingAccess
1775+ fun:_ZN14QReadWriteLock12lockForWriteEv
1776+ fun:_ZN14QObjectPrivate11clearGuardsEP7QObject
1777+ fun:_ZN7QObjectD2Ev
1778+}
1779+{
1780+ drd-libQtCore-QObjectPrivate::clearGuards(QObject*)
1781+ drd:ConflictingAccess
1782+ fun:_ZN14QReadWriteLock12lockForWriteEv
1783+ fun:_ZN12QWriteLocker6relockEv
1784+ fun:_ZN12QWriteLockerC1EP14QReadWriteLock
1785+ fun:_ZN14QObjectPrivate11clearGuardsEP7QObject
1786+ fun:_ZN7QObjectD2Ev
1787+ fun:_ZN24QAbstractEventDispatcherD2Ev
1788+ fun:_ZN20QEventDispatcherGlibD0Ev
1789+}
1790+{
1791+ drd-libQtCore-QMutexPool::get(void const*)
1792+ drd:ConflictingAccess
1793+ fun:_ZN10QMutexPool3getEPKv
1794+}
1795+{
1796+ drd-libQtCore-qt_gettime_is_monotonic()
1797+ drd:ConflictingAccess
1798+ fun:_Z23qt_gettime_is_monotonicv
1799+}
1800+
1801+#
1802+# Suppression patterns for libboost.
1803+#
1804+
1805+# Suppress the races on boost::once_flag::epoch and on
1806+# boost::detail::this_thread_epoch. See also the source file
1807+# boost/thread/pthread/once.hpp in the Boost source tree
1808+# (https://svn.boost.org/trac/boost/browser/trunk/boost/thread/pthread/once.hpp).
1809+{
1810+ drd-libboost-boost::call_once<void (*)()>(boost::once_flag&, void (*)())
1811+ drd:ConflictingAccess
1812+ ...
1813+ fun:_ZN5boost9call_onceIPFvvEEEvRNS_9once_flagET_
1814+}
1815+{
1816+ drd-libboost-boost::detail::get_once_per_thread_epoch()
1817+ drd:ConflictingAccess
1818+ fun:_ZN5boost6detail25get_once_per_thread_epochEv
1819+}
1820+# Suppress the race reports on boost::detail::current_thread_tls_key. See also
1821+# https://svn.boost.org/trac/boost/ticket/3526 for more information about why
1822+# the access pattern of current_thread_tls_key is safe.
1823+{
1824+ drd-libboost-boost::detail::get_current_thread_data()
1825+ drd:ConflictingAccess
1826+ ...
1827+ fun:_ZN5boost6detail23get_current_thread_dataEv
1828+}
1829+{
1830+ drd-libboost-boost::detail::set_current_thread_data(boost::detail::thread_data_base*)
1831+ drd:ConflictingAccess
1832+ ...
1833+ fun:_ZN5boost6detail23set_current_thread_dataEPNS0_16thread_data_baseE
1834+}
1835+
1836+# FIXME 22 Jan 09: helgrind-glibc2X-005 overlaps with a lot of
1837+# other stuff. They should be removed.
1838+
1839+##----------------------------------------------------------------------##
1840+# Suppressions for the Helgrind tool when using
1841+# a glibc-2.{3,4,5,6,7,8,9} system
1842+
1843+####################################################
1844+# glibc-2.X specific
1845+# These are generic cover-alls which catch a lot of stuff
1846+# in various combinations of ld, libc and libpthread
1847+#
1848+# Note this is heavyhanded and not very clever:
1849+#
1850+# - suppress anything that has its top frame in ld.so
1851+# That's fine, since it's mostly dynamic linking stuff,
1852+# which has various deliberate (harmless) races
1853+#
1854+# - suppress anything that has its top frame in libc.so.
1855+# This really isn't clever, since it could hide some
1856+# legitimate races. But the problem is, if we don't do
1857+# this, then loads of errors to do with stdio are reported, because
1858+# H fails to see glibc's internal locking/unlocking of FILE*s
1859+# as required by POSIX. A better solution is needed.
1860+
1861+#{
1862+# helgrind-glibc2X-001
1863+# Helgrind:Race
1864+# obj:*/lib*/ld-2.*so*
1865+#}
1866+
1867+# helgrind-glibc2X-002 was merged into helgrind-glibc2X-001
1868+
1869+# helgrind-glibc2X-003 was merged into helgrind-glibc2X-001
1870+
1871+{
1872+ helgrind-glibc2X-004
1873+ Helgrind:Race
1874+ obj:*/lib*/libc-2.*so*
1875+}
1876+
1877+{
1878+ helgrind-glibc2X-005
1879+ Helgrind:Race
1880+ obj:*/lib*/libpthread-2.*so*
1881+}
1882+
1883+# helgrind-glibc2X-006 was merged into helgrind-glibc2X-005
1884+
1885+# helgrind-glibc2X-007 was merged into helgrind-glibc2X-001
1886+
1887+# helgrind-glibc2X-008 was merged into helgrind-glibc2X-004
1888+
1889+# helgrind-glibc2X-009 was merged into helgrind-glibc2X-004
1890+
1891+# helgrind-glibc2X-010 was merged into helgrind-glibc2X-001
1892+
1893+# helgrind-glibc2X-011 was merged into helgrind-glibc2X-004
1894+
1895+# helgrind-glibc2X-012 was merged into helgrind-glibc2X-001
1896+
1897+# helgrind-glibc2X-013 was merged into helgrind-glibc2X-001
1898+
1899+# helgrind-glibc2X-014 was merged into helgrind-glibc2X-001
1900+
1901+# helgrind-glibc2X-015 was merged into helgrind-glibc2X-004
1902+
1903+# helgrind-glibc2X-016 was merged into helgrind-glibc2X-004
1904+
1905+# These are very ugly. They are needed to suppress errors inside (eg)
1906+# NPTL's pthread_cond_signal. Why only one stack frame -- at least we
1907+# should see the wrapper calling the real functions, right?
1908+# Unfortunately, no: the real functions are handwritten assembly (in
1909+# the glibc-2.5 sources) and does not create a proper stack frame.
1910+# Therefore it's only one level of unwinding before we're back out in
1911+# user code rather than the 2 levels you'd expect.
1912+{
1913+ helgrind-glibc2X-101
1914+ Helgrind:Race
1915+ obj:*/lib*/libpthread-2.*so*
1916+ fun:pthread_*
1917+}
1918+{
1919+ helgrind-glibc2X-102
1920+ Helgrind:Race
1921+ fun:mythread_wrapper
1922+ obj:*/lib*/libpthread-2.*so*
1923+}
1924+{
1925+ helgrind-glibc2X-103
1926+ Helgrind:Race
1927+ fun:pthread_cond_*@@GLIBC_2.*
1928+}
1929+{
1930+ helgrind-glibc2X-104
1931+ Helgrind:Race
1932+ fun:__lll_mutex_*
1933+}
1934+{
1935+ helgrind-glibc2X-105
1936+ Helgrind:Race
1937+ fun:pthread_rwlock_*lock*
1938+}
1939+{
1940+ helgrind-glibc2X-106
1941+ Helgrind:Race
1942+ fun:__lll_lock_wait
1943+}
1944+{
1945+ helgrind-glibc2X-107
1946+ Helgrind:Race
1947+ obj:*/lib*/libpthread-2.*so*
1948+ fun:sem_*
1949+}
1950+{
1951+ helgrind-glibc2X-108
1952+ Helgrind:Race
1953+ fun:clone
1954+}
1955+{
1956+ helgrind-glibc2X-109
1957+ Helgrind:Race
1958+ fun:start_thread
1959+}
1960+{
1961+ helgrind-glibc2X-110
1962+ Helgrind:Race
1963+ obj:*/lib*/libc-2.*so*
1964+ fun:pthread_*
1965+}
1966+{
1967+ helgrind-glibc2X-111
1968+ Helgrind:Race
1969+ fun:__lll_*lock_*
1970+}
1971+{
1972+ helgrind-glibc2X-113
1973+ Helgrind:Race
1974+ fun:pthread_barrier_wait*
1975+}
1976+
1977+
1978+####################################################
1979+# qt4 specific (GNU mangling)
1980+#
1981+{
1982+ helgrind-qt4---QMutex::lock()-QMutex::lock()
1983+ Helgrind:Race
1984+ ...
1985+ fun:_ZN6QMutex4lockEv
1986+ fun:_ZN6QMutex4lockEv
1987+}
1988+
1989+{
1990+ helgrind-qt4---QMutex::unlock()-QMutex::unlock()
1991+ Helgrind:Race
1992+ ...
1993+ fun:_ZN6QMutex6unlockEv
1994+ fun:_ZN6QMutex6unlockEv
1995+}
1996+
1997+{
1998+ helgrind-qt4---pthread_setspecific-QThreadPrivate::start(void*)
1999+ Helgrind:Race
2000+ fun:pthread_setspecific
2001+ fun:_ZN14QThreadPrivate5startEPv
2002+}
2003+
2004+
2005+####################################################
2006+# Other stuff.
2007+#
2008+# pthread_exit apparently calls some kind of unwind
2009+# mechanism - maybe to remove some number of frames
2010+# from the thread's stack, so as to get back to the
2011+# outermost frame for the thread? Anyway..
2012+
2013+{
2014+ helgrind---*Unwind*-...-pthread_exit
2015+ Helgrind:Race
2016+ fun:*Unwind*
2017+ ...
2018+ fun:pthread_exit
2019+}
2020+
2021+{
2022+ helgrind---...-*Unwind*-*pthread_unwind*
2023+ Helgrind:Race
2024+ ...
2025+ fun:*Unwind*
2026+ fun:*pthread_unwind*
2027+}
2028+
2029+{
2030+ helgrind---...-*Unwind*-*pthread_unwind*
2031+ Helgrind:Race
2032+ ...
2033+ fun:_Unwind*
2034+ ...
2035+ fun:_Unwind_Backtrace
2036+}
2037+
2038+
2039+
2040+
2041+####################################################
2042+# To do with thread stack allocation and deallocation?
2043+#
2044+{
2045+ helgrind---free_stacks-__deallocate_stack
2046+ Helgrind:Race
2047+ fun:free_stacks
2048+ fun:__deallocate_stack
2049+}
2050+
2051+{
2052+ helgrind---__deallocate_stack-start_thread-clone
2053+ Helgrind:Race
2054+ fun:__deallocate_stack
2055+ fun:start_thread
2056+ fun:clone
2057+}
2058+
2059+
2060+####################################################
2061+# To do with pthread_{set,get}specific
2062+#
2063+{
2064+ helgrind---pthread_setspecific
2065+ Helgrind:Race
2066+ fun:pthread_setspecific
2067+}
2068+
2069+{
2070+ helgrind---pthread_getspecific
2071+ Helgrind:Race
2072+ fun:pthread_getspecific
2073+}
2074+
2075+
2076+####################################################
2077+# To do with dynamic linking
2078+#
2079+# helgrind---ld.so-...-dlsym was merged into helgrind-glibc2X-001
2080+
2081+{
2082+ helgrind---_dl_allocate_tls
2083+ Helgrind:Race
2084+ fun:mempcpy
2085+ fun:_dl_allocate_tls_init
2086+ ...
2087+ fun:pthread_create@@GLIBC_2.2*
2088+ fun:pthread_create_WRK
2089+ fun:pthread_create@*
2090+}
2091+
2092+####################################################
2093+# To do with GNU libgomp
2094+#
2095+{
2096+ helgrind---libgomp43-1
2097+ Helgrind:Race
2098+ fun:gomp_ordered_sync
2099+}
2100+
2101+{
2102+ helgrind---libgomp43-1
2103+ Helgrind:Race
2104+ fun:gomp_ordered_next
2105+}
2106+
2107+{
2108+ helgrind---libgomp43-1
2109+ Helgrind:Race
2110+ fun:gomp_ordered_last
2111+}
2112+
2113+##----------------------------------------------------------------------##
2114+
2115+# Errors to suppress by default with glibc 2.21.x
2116+
2117+# IMPORTANT: DO NOT EDIT glibc-2.X.supp, as it is as a generated
2118+# file. Instead edit glibc-2.X.supp.in.
2119+
2120+# Format of this file is:
2121+# {
2122+# name_of_suppression
2123+# tool_name:supp_kind
2124+# (optional extra info for some suppression types)
2125+# caller0 name, or /name/of/so/file.so
2126+# caller1 name, or ditto
2127+# (optionally: caller2 name)
2128+# (optionally: caller3 name)
2129+# }
2130+#
2131+# For Memcheck, the supp_kinds are:
2132+#
2133+# Param Value1 Value2 Value4 Value8 Value16 Jump
2134+# Free Addr1 Addr2 Addr4 Addr8 Addr16
2135+# Cond (previously known as Value0)
2136+#
2137+# and the optional extra info is:
2138+# if Param: name of system call param
2139+
2140+##----------------------------------------------------------------------##
2141+##--- generic suppressions ---##
2142+##----------------------------------------------------------------------##
2143+
2144+{
2145+ dl-hack3-cond-0
2146+ Memcheck:Cond
2147+ fun:_dl_start
2148+ fun:_start
2149+}
2150+{
2151+ dl-hack3-cond-1
2152+ Memcheck:Cond
2153+ obj:*/lib*/ld-2.21*.so*
2154+ obj:*/lib*/ld-2.21*.so*
2155+ obj:*/lib*/ld-2.21*.so*
2156+}
2157+{
2158+ dl-hack3-cond-2
2159+ Memcheck:Cond
2160+ obj:*/lib*/ld-2.21*.so*
2161+ obj:*/lib*/ld-2.21*.so*
2162+ obj:*/lib*/libc-2.21*.so*
2163+}
2164+{
2165+ dl-hack3-cond-3
2166+ Memcheck:Cond
2167+ obj:*/lib*/ld-2.21*.so*
2168+ obj:*/lib*/libc-2.21*.so*
2169+ obj:*/lib*/libc-2.21*.so*
2170+}
2171+{
2172+ dl-hack3-cond-4
2173+ Memcheck:Cond
2174+ obj:*/lib*/ld-2.21*.so*
2175+ obj:*/lib*/ld-2.21*.so*
2176+ obj:*/lib*/libdl-2.21*.so*
2177+}
2178+
2179+{
2180+ dl-hack4-64bit-addr-1
2181+ Memcheck:Addr8
2182+ obj:*/lib*/ld-2.21*.so*
2183+ obj:*/lib*/ld-2.21*.so*
2184+ obj:*/lib*/ld-2.21*.so*
2185+}
2186+{
2187+ dl-hack4-64bit-addr-2
2188+ Memcheck:Addr8
2189+ obj:*/lib*/ld-2.21*.so*
2190+ obj:*/lib*/ld-2.21*.so*
2191+ obj:*/lib*/libc-2.21*.so*
2192+}
2193+{
2194+ dl-hack4-64bit-addr-3
2195+ Memcheck:Addr8
2196+ obj:*/lib*/ld-2.21*.so*
2197+ obj:*/lib*/ld-2.21*.so*
2198+ obj:*/lib*/libdl-2.21*.so*
2199+}
2200+
2201+{
2202+ dl-hack5-32bit-addr-1
2203+ Memcheck:Addr4
2204+ obj:*/lib*/ld-2.21*.so
2205+ obj:*/lib*/ld-2.21*.so
2206+ obj:*/lib*/ld-2.21*.so
2207+}
2208+{
2209+ dl-hack5-32bit-addr-3
2210+ Memcheck:Addr4
2211+ obj:*/lib*/ld-2.21*.so
2212+ obj:*/lib*/ld-2.21*.so
2213+ obj:*/lib*/libdl-2.21*.so*
2214+}
2215+{
2216+ dl-hack5-32bit-addr-4
2217+ Memcheck:Addr4
2218+ obj:*/lib*/ld-2.21*.so
2219+ obj:*/lib*/libdl-2.21*.so*
2220+ obj:*/lib*/ld-2.21*.so
2221+}
2222+
2223+
2224+##----------------------------------------------------------------------##
2225+##--- Misc ad-hoc hacks ---##
2226+##----------------------------------------------------------------------##
2227+{
2228+ glibc-2.5.x-on-SUSE-10.2-(PPC)-1
2229+ Memcheck:Cond
2230+ fun:_dl_start_final
2231+ fun:_dl_start
2232+ fun:_start
2233+}
2234+{
2235+ glibc-2.5.x-on-SUSE-10.2-(PPC)-2a
2236+ Memcheck:Cond
2237+ fun:index
2238+ obj:*ld-2.21.*.so
2239+}
2240+{
2241+ glibc-2.5.x-on-SuSE-10.2-(PPC)-2b
2242+ Memcheck:Addr4
2243+ fun:index
2244+ fun:expand_dynamic_string_token
2245+}
2246+{
2247+ glibc-2.5.5-on-SuSE-10.2-(PPC)-2c
2248+ Memcheck:Addr4
2249+ fun:index
2250+ obj:*ld-2.21.*.so
2251+}
2252+{
2253+ glibc-2.3.5-on-SuSE-10.1-(PPC)-3
2254+ Memcheck:Addr4
2255+ fun:*wordcopy_fwd_dest_aligned*
2256+ fun:mem*cpy
2257+ obj:*lib*2.21.*.so
2258+}
2259+
2260+{
2261+ glibc-2.21-on-SUSE-10.3-(x86)
2262+ Memcheck:Addr4
2263+ obj:*/lib/ld-2.21*.so
2264+ obj:*/lib/ld-2.21*.so
2265+ obj:*/lib/ld-2.21*.so
2266+}
2267+
2268+{
2269+ glibc24-64bit-padding-1a
2270+ Memcheck:Param
2271+ socketcall.sendto(msg)
2272+ fun:send
2273+ fun:get_mapping
2274+ fun:__nscd_get_map_ref
2275+ fun:nscd*
2276+}
2277+{
2278+ glibc24-64bit-padding-1b
2279+ Memcheck:Param
2280+ socketcall.sendto(msg)
2281+ fun:__sendto_nocancel
2282+ obj:/*libc-2.21*.so
2283+ obj:/*libc-2.21*.so
2284+ obj:/*libc-2.21*.so
2285+}
2286+{
2287+ glibc24-64bit-padding-1c
2288+ Memcheck:Param
2289+ socketcall.send(msg)
2290+ fun:send
2291+ fun:__nscd_get_map_ref
2292+ fun:nscd_get*_r
2293+ fun:*nscd*
2294+ obj:/*libc-2.21*.so
2295+}
2296+
2297+
2298+{
2299+ X11-64bit-padding-3a
2300+ Memcheck:Param
2301+ write(buf)
2302+ obj:/*libpthread-2.4.so*
2303+ obj:/usr/lib*/libX11.so*
2304+ obj:/usr/lib*/libX11.so*
2305+ obj:/usr/lib*/libX11.so*
2306+}
2307+
2308+{
2309+ X11-64bit-padding-4a
2310+ Memcheck:Param
2311+ socketcall.sendto(msg)
2312+ fun:send
2313+ obj:/*libc-2.21*.so
2314+ obj:/*libc-2.21*.so
2315+ obj:/*libc-2.21*.so
2316+}
2317+{
2318+ X11-64bit-padding-4b
2319+ Memcheck:Param
2320+ socketcall.send(msg)
2321+ fun:send
2322+ obj:/*libc-2.21*.so
2323+ obj:/*libc-2.21*.so
2324+ obj:/*libc-2.21*.so
2325+}
2326+
2327+##----------------------------------------------------------------------##
2328+# MontaVista Linux 4.0.1 on ppc32
2329+{
2330+ MVL-401-linuxthreads-pthread_create
2331+ Memcheck:Param
2332+ write(buf)
2333+ fun:pthread_create
2334+}
2335+{
2336+ MVL-401-linuxthreads-pthread_create
2337+ Memcheck:Param
2338+ write(buf)
2339+ obj:*/lib/libpthread-0.10.so
2340+ fun:pthread_create
2341+}
2342+
2343+##----------------------------------------------------------------------##
2344+# Ubuntu 10.04 on ARM (Thumb). Not sure why this is necessary.
2345+{
2346+ U1004-ARM-_dl_relocate_object
2347+ Memcheck:Cond
2348+ fun:_dl_relocate_object
2349+}

Subscribers

People subscribed via source and target branches

to all changes: