[haiku-commits] haiku: hrev48990 - headers/os/support headers/posix src/system/libroot/posix/malloc_debug

  • From: mmlr@xxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 4 Apr 2015 22:57:20 +0200 (CEST)

hrev48990 adds 4 changesets to branch 'master'
old head: f67071b98ca57efd722b4603fcfe1c899fd2c4ce
new head: 121655e9ee3e7fa6d9244df8c68ad30f9981af8c
overview:
http://cgit.haiku-os.org/haiku/log/?qt=range&q=121655e9ee3e+%5Ef67071b98ca5

----------------------------------------------------------------------------

a05bfeb4a92d: Whitespace cleanup only.

5ae3af6cc541: SupportDefs: Add B_SCN* counterparts for some more types.

Namely for [s]size_t, [{phys|generic}_]addr_t and off_t.

b0e31a9ce35e: Revert "malloc_debug: align allocations".

This reverts commit 217f090f9e247d1d4c5644e626642c430fafe4e5.

At least for the guarded heap this completely defeats the purpose. If
software requires a certain alignment it should request it using
memalign explicitly instead of assuming it.

121655e9ee3e: malloc_debug: Add default alignment option.

This allows for something similar as was implemented in 217f090 but
makes it optional and configurable.

The MALLOC_DEBUG environment variable now can take "a<size>" to set
the default alignment to the specified size. Note that not all
alignments may be supported depending on the heap implementation.

[ Michael Lotz <mmlr@xxxxxxxx> ]

----------------------------------------------------------------------------

5 files changed, 108 insertions(+), 43 deletions(-)
headers/os/support/SupportDefs.h | 62 +++++++++++++++-----
headers/posix/inttypes.h | 46 +++++++--------
headers/posix/malloc_debug.h | 1 +
.../libroot/posix/malloc_debug/guarded_heap.cpp | 20 ++++++-
src/system/libroot/posix/malloc_debug/heap.cpp | 22 ++++++-

############################################################################

Commit: a05bfeb4a92d8c2b4bfe6a8bf78a2808e7556a8e
URL: http://cgit.haiku-os.org/haiku/commit/?id=a05bfeb4a92d
Author: Michael Lotz <mmlr@xxxxxxxx>
Date: Sat Apr 4 13:49:19 2015 UTC

Whitespace cleanup only.

----------------------------------------------------------------------------

diff --git a/headers/os/support/SupportDefs.h b/headers/os/support/SupportDefs.h
index a7c13b9..2b5e3c4 100644
--- a/headers/os/support/SupportDefs.h
+++ b/headers/os/support/SupportDefs.h
@@ -27,7 +27,7 @@ typedef __haiku_int64 int64;
typedef __haiku_uint64 uint64;

/* shorthand types */
-typedef volatile int8 vint8;
+typedef volatile int8 vint8;
typedef volatile uint8 vuint8;
typedef volatile int16 vint16;
typedef volatile uint16 vuint16;
@@ -47,7 +47,7 @@ typedef volatile unsigned short vushort;
typedef volatile unsigned char vuchar;

typedef unsigned char uchar;
-typedef unsigned short unichar;
+typedef unsigned short unichar;

/* descriptive types */
typedef int32 status_t;
@@ -89,23 +89,23 @@ typedef generic_addr_t generic_size_t;
#define B_PRIx64 __HAIKU_PRI_PREFIX_64 "x"
#define B_PRIX64 __HAIKU_PRI_PREFIX_64 "X"

-#define B_SCNd8 "hhd"
-#define B_SCNi8 "hhi"
+#define B_SCNd8 "hhd"
+#define B_SCNi8 "hhi"
#define B_SCNd16 "hd"
-#define B_SCNi16 "hi"
-#define B_SCNd32 __HAIKU_PRI_PREFIX_32 "d"
-#define B_SCNi32 __HAIKU_PRI_PREFIX_32 "i"
+#define B_SCNi16 "hi"
+#define B_SCNd32 __HAIKU_PRI_PREFIX_32 "d"
+#define B_SCNi32 __HAIKU_PRI_PREFIX_32 "i"
#define B_SCNd64 __HAIKU_PRI_PREFIX_64 "d"
-#define B_SCNi64 __HAIKU_PRI_PREFIX_64 "i"
-#define B_SCNu8 "hhu"
-#define B_SCNo8 "hho"
-#define B_SCNx8 "hhx"
+#define B_SCNi64 __HAIKU_PRI_PREFIX_64 "i"
+#define B_SCNu8 "hhu"
+#define B_SCNo8 "hho"
+#define B_SCNx8 "hhx"
#define B_SCNu16 "hu"
#define B_SCNo16 "ho"
#define B_SCNx16 "hx"
-#define B_SCNu32 __HAIKU_PRI_PREFIX_32 "u"
-#define B_SCNo32 __HAIKU_PRI_PREFIX_32 "o"
-#define B_SCNx32 __HAIKU_PRI_PREFIX_32 "x"
+#define B_SCNu32 __HAIKU_PRI_PREFIX_32 "u"
+#define B_SCNo32 __HAIKU_PRI_PREFIX_32 "o"
+#define B_SCNx32 __HAIKU_PRI_PREFIX_32 "x"
#define B_SCNu64 __HAIKU_PRI_PREFIX_64 "u"
#define B_SCNo64 __HAIKU_PRI_PREFIX_64 "o"
#define B_SCNx64 __HAIKU_PRI_PREFIX_64 "x"
diff --git a/headers/posix/inttypes.h b/headers/posix/inttypes.h
index 8abc015..80d6834 100644
--- a/headers/posix/inttypes.h
+++ b/headers/posix/inttypes.h
@@ -112,33 +112,33 @@ typedef struct {
# define PRIXPTR __HAIKU_PRI_PREFIX_ADDR "X"

/* fscanf() macros for signed integers */
-# define SCNd8 "hhd"
-# define SCNdLEAST8 "hhd"
-# define SCNdFAST8 "d"
-# define SCNi8 "hhi"
-# define SCNiLEAST8 "hhi"
-# define SCNiFAST8 "i"
+# define SCNd8 "hhd"
+# define SCNdLEAST8 "hhd"
+# define SCNdFAST8 "d"
+# define SCNi8 "hhi"
+# define SCNiLEAST8 "hhi"
+# define SCNiFAST8 "i"

# define SCNd16 "hd"
# define SCNdLEAST16 "hd"
# define SCNdFAST16 "d"
-# define SCNi16 "hi"
+# define SCNi16 "hi"
# define SCNiLEAST16 "hi"
# define SCNiFAST16 "i"

-# define SCNd32 __HAIKU_STD_PRI_PREFIX_32 "d"
+# define SCNd32 __HAIKU_STD_PRI_PREFIX_32 "d"
# define SCNdLEAST32 SCNd32
# define SCNdFAST32 SCNd32
-# define SCNi32 __HAIKU_STD_PRI_PREFIX_32 "i"
+# define SCNi32 __HAIKU_STD_PRI_PREFIX_32 "i"
# define SCNiLEAST32 SCNi32
# define SCNiFAST32 SCNi32

# define SCNd64 __HAIKU_STD_PRI_PREFIX_64 "d"
# define SCNdLEAST64 SCNd64
# define SCNdFAST64 SCNd64
-# define SCNi64 __HAIKU_STD_PRI_PREFIX_64 "i"
+# define SCNi64 __HAIKU_STD_PRI_PREFIX_64 "i"
# define SCNiLEAST64 SCNi64
-# define SCNiFAST64 SCNi64
+# define SCNiFAST64 SCNi64

# define SCNdMAX SCNd64
# define SCNdPTR __HAIKU_PRI_PREFIX_ADDR "d"
@@ -146,15 +146,15 @@ typedef struct {
# define SCNiPTR __HAIKU_PRI_PREFIX_ADDR "i"

/* fscanf() macros for unsigned integers */
-# define SCNu8 "hhu"
-# define SCNuLEAST8 "hhu"
-# define SCNuFAST8 "u"
-# define SCNo8 "hho"
-# define SCNoLEAST8 "hho"
-# define SCNoFAST8 "o"
-# define SCNx8 "hhx"
-# define SCNxLEAST8 "hhx"
-# define SCNxFAST8 "x"
+# define SCNu8 "hhu"
+# define SCNuLEAST8 "hhu"
+# define SCNuFAST8 "u"
+# define SCNo8 "hho"
+# define SCNoLEAST8 "hho"
+# define SCNoFAST8 "o"
+# define SCNx8 "hhx"
+# define SCNxLEAST8 "hhx"
+# define SCNxFAST8 "x"

# define SCNu16 "hu"
# define SCNuLEAST16 "hu"
@@ -166,13 +166,13 @@ typedef struct {
# define SCNxLEAST16 "hx"
# define SCNxFAST16 "x"

-# define SCNu32 __HAIKU_STD_PRI_PREFIX_32 "u"
+# define SCNu32 __HAIKU_STD_PRI_PREFIX_32 "u"
# define SCNuLEAST32 SCNu32
# define SCNuFAST32 SCNu32
-# define SCNo32 __HAIKU_STD_PRI_PREFIX_32 "o"
+# define SCNo32 __HAIKU_STD_PRI_PREFIX_32 "o"
# define SCNoLEAST32 SCNo32
# define SCNoFAST32 SCNo32
-# define SCNx32 __HAIKU_STD_PRI_PREFIX_32 "x"
+# define SCNx32 __HAIKU_STD_PRI_PREFIX_32 "x"
# define SCNxLEAST32 SCNx32
# define SCNxFAST32 SCNx32


############################################################################

Commit: 5ae3af6cc541a3eac4868618d5b78b1d14504939
URL: http://cgit.haiku-os.org/haiku/commit/?id=5ae3af6cc541
Author: Michael Lotz <mmlr@xxxxxxxx>
Date: Sat Apr 4 13:54:10 2015 UTC

SupportDefs: Add B_SCN* counterparts for some more types.

Namely for [s]size_t, [{phys|generic}_]addr_t and off_t.

----------------------------------------------------------------------------

diff --git a/headers/os/support/SupportDefs.h b/headers/os/support/SupportDefs.h
index 2b5e3c4..e151236 100644
--- a/headers/os/support/SupportDefs.h
+++ b/headers/os/support/SupportDefs.h
@@ -110,43 +110,75 @@ typedef generic_addr_t generic_size_t;
#define B_SCNo64 __HAIKU_PRI_PREFIX_64 "o"
#define B_SCNx64 __HAIKU_PRI_PREFIX_64 "x"

-/* printf() format strings for some standard types */
+/* printf()/scanf() format strings for some standard types */
/* size_t */
#define B_PRIuSIZE __HAIKU_PRI_PREFIX_ADDR "u"
#define B_PRIoSIZE __HAIKU_PRI_PREFIX_ADDR "o"
#define B_PRIxSIZE __HAIKU_PRI_PREFIX_ADDR "x"
#define B_PRIXSIZE __HAIKU_PRI_PREFIX_ADDR "X"
+
+#define B_SCNuSIZE __HAIKU_PRI_PREFIX_ADDR "u"
+#define B_SCNoSIZE __HAIKU_PRI_PREFIX_ADDR "o"
+#define B_SCNxSIZE __HAIKU_PRI_PREFIX_ADDR "x"
+
/* ssize_t */
#define B_PRIdSSIZE __HAIKU_PRI_PREFIX_ADDR "d"
#define B_PRIiSSIZE __HAIKU_PRI_PREFIX_ADDR "i"
+
+#define B_SCNdSSIZE __HAIKU_PRI_PREFIX_ADDR "d"
+#define B_SCNiSSIZE __HAIKU_PRI_PREFIX_ADDR "i"
+
/* addr_t */
#define B_PRIuADDR __HAIKU_PRI_PREFIX_ADDR "u"
#define B_PRIoADDR __HAIKU_PRI_PREFIX_ADDR "o"
#define B_PRIxADDR __HAIKU_PRI_PREFIX_ADDR "x"
#define B_PRIXADDR __HAIKU_PRI_PREFIX_ADDR "X"
+
+#define B_SCNuADDR __HAIKU_PRI_PREFIX_ADDR "u"
+#define B_SCNoADDR __HAIKU_PRI_PREFIX_ADDR "o"
+#define B_SCNxADDR __HAIKU_PRI_PREFIX_ADDR "x"
+
/* phys_addr_t */
#define B_PRIuPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "u"
#define B_PRIoPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "o"
#define B_PRIxPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "x"
#define B_PRIXPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "X"
+
+#define B_SCNuPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "u"
+#define B_SCNoPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "o"
+#define B_SCNxPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "x"
+
/* generic_addr_t */
#define B_PRIuGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "u"
#define B_PRIoGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "o"
#define B_PRIxGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "x"
#define B_PRIXGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "X"
+
+#define B_SCNuGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "u"
+#define B_SCNoGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "o"
+#define B_SCNxGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "x"
+
/* off_t */
#define B_PRIdOFF B_PRId64
#define B_PRIiOFF B_PRIi64
#define B_PRIxOFF B_PRIx64
+
+#define B_SCNdOFF B_SCNd64
+#define B_SCNiOFF B_SCNi64
+#define B_SCNxOFF B_SCNx64
+
/* dev_t */
#define B_PRIdDEV B_PRId32
#define B_PRIiDEV B_PRIi32
+
/* ino_t */
#define B_PRIdINO B_PRId64
#define B_PRIiINO B_PRIi64
+
/* time_t */
#define B_PRIdTIME B_PRId32
#define B_PRIiTIME B_PRIi32
+
/* bigtime_t */
#define B_PRIdBIGTIME B_PRId64
#define B_PRIiBIGTIME B_PRIi64

############################################################################

Commit: b0e31a9ce35e3d3d47b59a21e7c43b0d41c11d11
URL: http://cgit.haiku-os.org/haiku/commit/?id=b0e31a9ce35e
Author: Michael Lotz <mmlr@xxxxxxxx>
Date: Sat Apr 4 14:38:46 2015 UTC

Revert "malloc_debug: align allocations".

This reverts commit 217f090f9e247d1d4c5644e626642c430fafe4e5.

At least for the guarded heap this completely defeats the purpose. If
software requires a certain alignment it should request it using
memalign explicitly instead of assuming it.

----------------------------------------------------------------------------

diff --git a/src/system/libroot/posix/malloc_debug/guarded_heap.cpp
b/src/system/libroot/posix/malloc_debug/guarded_heap.cpp
index 2d5600a..2bb4f19 100644
--- a/src/system/libroot/posix/malloc_debug/guarded_heap.cpp
+++ b/src/system/libroot/posix/malloc_debug/guarded_heap.cpp
@@ -966,7 +966,7 @@ memalign(size_t alignment, size_t size)
extern "C" void*
malloc(size_t size)
{
- return memalign(size >= 8 ? 8 : 0, size);
+ return memalign(0, size);
}


@@ -987,7 +987,7 @@ realloc(void* address, size_t newSize)
}

if (address == NULL)
- return memalign(size >= 8 ? 8 : 0, newSize);
+ return memalign(0, newSize);

return guarded_heap_realloc(address, newSize);
}
diff --git a/src/system/libroot/posix/malloc_debug/heap.cpp
b/src/system/libroot/posix/malloc_debug/heap.cpp
index 699de22..074cada 100644
--- a/src/system/libroot/posix/malloc_debug/heap.cpp
+++ b/src/system/libroot/posix/malloc_debug/heap.cpp
@@ -1465,7 +1465,7 @@ heap_realloc(heap_allocator *heap, void *address, void
**newAddress,
newSize -= sizeof(addr_t) + sizeof(heap_leak_check_info);

// if not, allocate a new chunk of memory
- *newAddress = memalign(newSize >= 8 ? 8 : 0, newSize);
+ *newAddress = memalign(0, newSize);
if (*newAddress == NULL) {
// we tried but it didn't work out, but still the operation is
done
return B_OK;
@@ -1937,7 +1937,7 @@ malloc(size_t size)
if (sUseGuardPage)
return heap_debug_malloc_with_guard_page(size);

- return memalign(size >= 8 ? 8 : 0, size);
+ return memalign(0, size);
}


@@ -1978,7 +1978,7 @@ void *
realloc(void *address, size_t newSize)
{
if (address == NULL)
- return memalign(newSize >= 8 ? 8 : 0, newSize);
+ return memalign(0, newSize);

if (newSize == 0) {
free(address);

############################################################################

Revision: hrev48990
Commit: 121655e9ee3e7fa6d9244df8c68ad30f9981af8c
URL: http://cgit.haiku-os.org/haiku/commit/?id=121655e9ee3e
Author: Michael Lotz <mmlr@xxxxxxxx>
Date: Sat Apr 4 14:41:45 2015 UTC

malloc_debug: Add default alignment option.

This allows for something similar as was implemented in 217f090 but
makes it optional and configurable.

The MALLOC_DEBUG environment variable now can take "a<size>" to set
the default alignment to the specified size. Note that not all
alignments may be supported depending on the heap implementation.

----------------------------------------------------------------------------

diff --git a/headers/posix/malloc_debug.h b/headers/posix/malloc_debug.h
index 0c23bbb..d58bf34 100644
--- a/headers/posix/malloc_debug.h
+++ b/headers/posix/malloc_debug.h
@@ -18,6 +18,7 @@ status_t heap_debug_stop_wall_checking();
void heap_debug_set_memory_reuse(bool enabled);
void heap_debug_set_paranoid_validation(bool enabled);
void heap_debug_set_debugger_calls(bool enabled);
+void heap_debug_set_default_alignment(size_t defaultAlignment);
void heap_debug_validate_heaps();
void heap_debug_validate_walls();

diff --git a/src/system/libroot/posix/malloc_debug/guarded_heap.cpp
b/src/system/libroot/posix/malloc_debug/guarded_heap.cpp
index 2bb4f19..1e0bd70 100644
--- a/src/system/libroot/posix/malloc_debug/guarded_heap.cpp
+++ b/src/system/libroot/posix/malloc_debug/guarded_heap.cpp
@@ -19,6 +19,7 @@


static bool sDebuggerCalls = true;
+static size_t sDefaultAlignment = 0;


static void
@@ -834,6 +835,13 @@ heap_debug_set_debugger_calls(bool enabled)


extern "C" void
+heap_debug_set_default_alignment(size_t defaultAlignment)
+{
+ sDefaultAlignment = defaultAlignment;
+}
+
+
+extern "C" void
heap_debug_validate_heaps()
{
}
@@ -937,6 +945,14 @@ __init_heap_post_env(void)
if (mode != NULL) {
if (strchr(mode, 'r'))
heap_debug_set_memory_reuse(false);
+
+ size_t defaultAlignment = 0;
+ const char *argument = strchr(mode, 'a');
+ if (argument != NULL
+ && sscanf(argument, "a%" B_SCNuSIZE, &defaultAlignment)
== 1
+ && defaultAlignment > 0) {
+ heap_debug_set_default_alignment(defaultAlignment);
+ }
}
}

@@ -966,7 +982,7 @@ memalign(size_t alignment, size_t size)
extern "C" void*
malloc(size_t size)
{
- return memalign(0, size);
+ return memalign(sDefaultAlignment, size);
}


@@ -987,7 +1003,7 @@ realloc(void* address, size_t newSize)
}

if (address == NULL)
- return memalign(0, newSize);
+ return memalign(sDefaultAlignment, newSize);

return guarded_heap_realloc(address, newSize);
}
diff --git a/src/system/libroot/posix/malloc_debug/heap.cpp
b/src/system/libroot/posix/malloc_debug/heap.cpp
index 074cada..1b735b5 100644
--- a/src/system/libroot/posix/malloc_debug/heap.cpp
+++ b/src/system/libroot/posix/malloc_debug/heap.cpp
@@ -44,6 +44,7 @@ static bool sParanoidValidation = false;
static thread_id sWallCheckThread = -1;
static bool sStopWallChecking = false;
static bool sUseGuardPage = false;
+static bool sDefaultAlignment = 0;


void
@@ -1465,7 +1466,7 @@ heap_realloc(heap_allocator *heap, void *address, void
**newAddress,
newSize -= sizeof(addr_t) + sizeof(heap_leak_check_info);

// if not, allocate a new chunk of memory
- *newAddress = memalign(0, newSize);
+ *newAddress = memalign(sDefaultAlignment, newSize);
if (*newAddress == NULL) {
// we tried but it didn't work out, but still the operation is
done
return B_OK;
@@ -1682,6 +1683,13 @@ heap_debug_set_debugger_calls(bool enabled)


extern "C" void
+heap_debug_set_default_alignment(size_t defaultAlignment)
+{
+ sDefaultAlignment = defaultAlignment;
+}
+
+
+extern "C" void
heap_debug_validate_heaps()
{
for (uint32 i = 0; i < HEAP_CLASS_COUNT; i++)
@@ -1839,6 +1847,14 @@ __init_heap_post_env(void)
sUseGuardPage = true;
if (strchr(mode, 'r'))
heap_debug_set_memory_reuse(false);
+
+ size_t defaultAlignment = 0;
+ const char *argument = strchr(mode, 'a');
+ if (argument != NULL
+ && sscanf(argument, "a%" B_SCNuSIZE, &defaultAlignment)
== 1
+ && defaultAlignment > 0) {
+ heap_debug_set_default_alignment(defaultAlignment);
+ }
}
}

@@ -1937,7 +1953,7 @@ malloc(size_t size)
if (sUseGuardPage)
return heap_debug_malloc_with_guard_page(size);

- return memalign(0, size);
+ return memalign(sDefaultAlignment, size);
}


@@ -1978,7 +1994,7 @@ void *
realloc(void *address, size_t newSize)
{
if (address == NULL)
- return memalign(0, newSize);
+ return memalign(sDefaultAlignment, newSize);

if (newSize == 0) {
free(address);


Other related posts: