Align all SkRecord::alloc() calls up to at least a pointer size.
This should make the LSAN bots able to see all our pointers. BUG=skia: R=reed@google.com, robertphillips@google.com, mtklein@google.com Author: mtklein@chromium.org Review URL: https://codereview.chromium.org/517073002
This commit is contained in:
parent
23b406cc04
commit
0209e95cc2
@ -300,6 +300,9 @@ static inline bool SkIsU16(long x) {
|
||||
#define SkAlign8(x) (((x) + 7) >> 3 << 3)
|
||||
#define SkIsAlign8(x) (0 == ((x) & 7))
|
||||
|
||||
#define SkAlignPtr(x) (sizeof(void*) == 8 ? SkAlign8(x) : SkAlign4(x))
|
||||
#define SkIsAlignPtr(x) (sizeof(void*) == 8 ? SkIsAlign8(x) : SkIsAlign4(x))
|
||||
|
||||
typedef uint32_t SkFourByteTag;
|
||||
#define SkSetFourByteTag(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
|
||||
|
||||
|
@ -65,7 +65,8 @@ public:
|
||||
// Here T can be any class, not just those from SkRecords. Throws on failure.
|
||||
template <typename T>
|
||||
T* alloc(size_t count = 1) {
|
||||
return (T*)fAlloc.allocThrow(sizeof(T) * count);
|
||||
// Bump up to the next pointer width if needed, so all allocations start pointer-aligned.
|
||||
return (T*)fAlloc.allocThrow(SkAlignPtr(sizeof(T) * count));
|
||||
}
|
||||
|
||||
// Add a new command of type T to the end of this SkRecord.
|
||||
|
@ -78,3 +78,28 @@ DEF_TEST(Record, r) {
|
||||
|
||||
#undef APPEND
|
||||
|
||||
template <typename T>
|
||||
static bool is_aligned(const T* p) {
|
||||
return (((uintptr_t)p) & (sizeof(T) - 1)) == 0;
|
||||
}
|
||||
|
||||
DEF_TEST(Record_Alignment, r) {
|
||||
SkRecord record;
|
||||
|
||||
// Of course a byte's always aligned.
|
||||
REPORTER_ASSERT(r, is_aligned(record.alloc<uint8_t>()));
|
||||
|
||||
// (If packed tightly, the rest below here would be off by one.)
|
||||
|
||||
// It happens that the first implementation always aligned to 4 bytes,
|
||||
// so these two were always correct.
|
||||
REPORTER_ASSERT(r, is_aligned(record.alloc<uint16_t>()));
|
||||
REPORTER_ASSERT(r, is_aligned(record.alloc<uint32_t>()));
|
||||
|
||||
// These two are regression tests (void* only on 64-bit machines).
|
||||
REPORTER_ASSERT(r, is_aligned(record.alloc<uint64_t>()));
|
||||
REPORTER_ASSERT(r, is_aligned(record.alloc<void*>()));
|
||||
|
||||
// We're not testing beyond sizeof(void*), which is where the current implementation will break.
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user