Merge pull request #155 from bluca/alignment

Problem: pointer union for zmq_msg_t is a hack
This commit is contained in:
Doron Somech 2016-11-01 16:48:14 +02:00 committed by GitHub
commit 3ae04f1d3e
2 changed files with 18 additions and 3 deletions

2
NEWS
View File

@ -15,6 +15,8 @@
* Fixed #2161 - messages dropped due to HWM race
* Fixed #1325 - alignment issue with zmq_msg_t causes SIGBUS on SPARC and ARM
0MQ version 4.1.5 stable, released on 2016/06/17
================================================

View File

@ -205,10 +205,23 @@ ZMQ_EXPORT int zmq_ctx_destroy (void *context);
/* 0MQ message definition. */
/******************************************************************************/
/* union here ensures correct alignment on architectures that require it, e.g.
* SPARC and ARM
/* Some architectures, like sparc64 and some variants of aarch64, enforce pointer
* alignment and raise sigbus on violations. Make sure applications allocate
* zmq_msg_t on addresses aligned on a pointer-size boundary to avoid this issue.
*/
typedef union zmq_msg_t { unsigned char _ [64]; void *p; } zmq_msg_t;
typedef struct zmq_msg_t {
#if defined (__GNUC__) || defined ( __INTEL_COMPILER) || \
(defined (__SUNPRO_C) && __SUNPRO_C >= 0x590) || \
(defined (__SUNPRO_CC) && __SUNPRO_CC >= 0x590)
unsigned char _ [64] __attribute__ ((aligned (sizeof (void *))));
#elif defined (_MSC_VER) && (defined (_M_X64) || defined (_M_ARM64))
__declspec (align (8)) unsigned char _ [64];
#elif defined (_MSC_VER) && (defined (_M_IX86) || defined (_M_ARM_ARMV7VE))
__declspec (align (4)) unsigned char _ [64];
#else
unsigned char _ [64];
#endif
} zmq_msg_t;
typedef void (zmq_free_fn) (void *data, void *hint);