Skip to content
Snippets Groups Projects
Commit 0024d684 authored by Kevin P. Fleming's avatar Kevin P. Fleming
Browse files

Merged revisions 129966 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r129966 | kpfleming | 2008-07-11 09:03:52 -0500 (Fri, 11 Jul 2008) | 5 lines

fix a flaw found while experimenting with structure alignment and padding; low-fence checking would not work properly on 64-bit platforms, because the compiler was putting 4 bytes of padding between the fence field and the allocation memory block

added a very obvious runtime warning if this condition reoccurs, so the developer who broke it can be chastised into fixing it :-)


........
r129967 | kpfleming | 2008-07-11 09:03:52 -0500 (Fri, 11 Jul 2008) | 5 lines

simplify calculation

........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@129968 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent 1fad3812
No related branches found
No related tags found
No related merge requests found
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
ASTERISK_FILE_VERSION(__FILE__, "$Revision$") ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/paths.h" /* use ast_config_AST_LOG_DIR */ #include "asterisk/paths.h" /* use ast_config_AST_LOG_DIR */
#include <stddef.h>
#include <time.h> #include <time.h>
#include "asterisk/cli.h" #include "asterisk/cli.h"
...@@ -63,14 +64,26 @@ enum func_type { ...@@ -63,14 +64,26 @@ enum func_type {
static FILE *mmlog; static FILE *mmlog;
/* NOTE: Be EXTREMELY careful with modifying this structure; the total size of this structure
must result in 'automatic' alignment so that the 'fence' field lands exactly at the end of
the structure in memory (and thus immediately before the allocated region the fence is
supposed to be used to monitor). In other words, we cannot allow the compiler to insert
any padding between this structure and anything following it, so add up the sizes of all the
fields and compare to sizeof(struct ast_region)... if they don't match, then the compiler
is padding the structure and either the fields need to be rearranged to eliminate internal
padding, or a dummy field will need to be inserted before the 'fence' field to push it to
the end of the actual space it will consume. Note that this must be checked for both 32-bit
and 64-bit platforms, as the sizes of pointers and 'size_t' differ on these platforms.
*/
static struct ast_region { static struct ast_region {
struct ast_region *next; struct ast_region *next;
size_t len;
char file[64]; char file[64];
char func[40]; char func[40];
unsigned int lineno; unsigned int lineno;
enum func_type which; enum func_type which;
unsigned int cache; /* region was allocated as part of a cache pool */ unsigned int cache; /* region was allocated as part of a cache pool */
size_t len;
unsigned int fence; unsigned int fence;
unsigned char data[0]; unsigned char data[0];
} *regions[SOME_PRIME]; } *regions[SOME_PRIME];
...@@ -462,6 +475,11 @@ static struct ast_cli_entry cli_memory[] = { ...@@ -462,6 +475,11 @@ static struct ast_cli_entry cli_memory[] = {
void __ast_mm_init(void) void __ast_mm_init(void)
{ {
char filename[PATH_MAX]; char filename[PATH_MAX];
size_t pad = sizeof(struct ast_region) - offsetof(struct ast_region, data);
if (pad) {
ast_log(LOG_ERROR, "struct ast_region has %d bytes of padding! This must be eliminated for low-fence checking to work properly!\n", (int) pad);
}
ast_cli_register_multiple(cli_memory, sizeof(cli_memory) / sizeof(struct ast_cli_entry)); ast_cli_register_multiple(cli_memory, sizeof(cli_memory) / sizeof(struct ast_cli_entry));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment