Open Bug 188849 Opened 22 years ago Updated 1 year ago

Need macro to align a memory pointer to match the platform's memory alignment policy

Categories

(NSPR :: NSPR, defect)

defect

Tracking

(Not tracked)

People

(Reporter: roland.mainz, Unassigned)

References

Details

We need macro in NSPR to align a memory pointer to match the platform's memory
alignment policy.
The idea is that someone can alloc a larger chunk of memory and then use his/her
own way to assign this memory to structures instead of calling |malloc()| for
each structure, reducing dramatically the overhead caused my |malloc()| and
required error checking and cleanup.
The alignment macro is required for platforms which force the correct alignment
or send a SIGSEGV/SIGBUS to the application (SPARC is one of these platforms).

For example:
-- snip --
/* Alignment macros to force memory alignment required by most RISC platforms
 * MAX_ALIGN_BYTES = sizeof(pointer) incl. the doubleword alignment required
 * by some platforms, ALIGN_PTR() aligns the given pointer to match
 * MAX_ALIGN_BYTES alignment
 */
#define MAX_ALIGN_BYTES (sizeof(void *) * 2)
#define ALIGN_PTR(ptr) ((void *)(((PRUptrdiff)(ptr) & ~(MAX_ALIGN_BYTES-1L)) +
MAX_ALIGN_BYTES))
-- snip --
This macros allows that any "in" pointer is getting aligned to be a multiple of
|MAX_ALIGN_BYTES|.

Proposed macros:
1. "PR_MIN_ALIGN_BYTES" - a pointer on the matching platform must be a multiple
of |PR_MIN_ALIGN_BYTES| to be properly aligned ("1" for x86, "4" for SPARC
32bit, "8" for SPARC 64bit. etc.)
2. "PR_ALIGN_PTR" to align a pointer on a given number of bytes (this number
must be a result of 2^n)
#define PR_ALIGN_PTR(ptr, alignment) ((void *)(((PRUptrdiff)(ptr) &
~((alignment)-1L)) + (alignment)))
Blocks: 192070
wtc:
Any comments/suggestions/ideas ?
I am not sure that this macro is generally useful
and I am not confident that I know how to test it.
Wan-Teh Chang wrote:
> I am not sure that this macro is generally useful

AFAIK we have multiple places in Mozilla where people currently do their own
alignment stuff... my idea was to kill all the homegrown code (which is likely
to trigger portability issues sooner or later) and make a NSPR macro from it to
have a central place to do adjustments if neccesary.
QA Contact: wtchang → nspr
Yes, we definitely can use this change!  We're currently trying to install/use OpenAM with Apache 2.2.17 on a Solaris 10 Sparc (T1000).  The OpenAM agent crashes though every single time you try to use a secure socket with a SIGBUS error.  Just for the record, yes, I *did* ask them.  They pointed us here, since the problem is outside of their code.  I can provide a pstack or truss output here if that would be helpful.
Nick, this antique bug seems invalid to me. Do you think that [sizeof(Type)] is not a good alignment for Type?
(In reply to comment #4)
Bernhard Thalmayr reported a crash that sounds like what you described on the
dev-tech-crypto@lists.mozilla.org mailing list.  He tracked it down to a bug in
the OpenAM agent code.  The variable in question is a local variable, allocated
on the stack by the compiler, so that crash is not related to this requested
macro.  (The OpenAM agent code declares a 'bool' local variable but casts its
address to int * .)
Severity: normal → S3

The bug assignee is inactive on Bugzilla, so the assignee is being reset.

Assignee: wtc → nobody
You need to log in before you can comment on or make changes to this bug.