(trunk, libutp) #4260 "uTP not working when compiler doesn't honor 'pragma pack'" -- apply alus' revised patch for testing.

This commit is contained in:
Jordan Lee 2011-07-30 22:15:32 +00:00
parent 0faddf054b
commit cdb95995e8
2 changed files with 13 additions and 27 deletions

View File

@ -35,12 +35,7 @@ template <typename T> static inline T clamp(T v, T mi, T ma)
return v; return v;
} }
#ifdef __GNUC__ #pragma pack(push,1)
#define PACKED_ATTRIBUTE __attribute__((__packed__))
#else
#define PACKED_ATTRIBUTE
#pragma pack(push,1)
#endif
namespace aux namespace aux
{ {
@ -53,7 +48,7 @@ namespace aux
} }
template <class T> template <class T>
struct PACKED_ATTRIBUTE big_endian struct big_endian
{ {
T operator=(T i) { m_integer = aux::host_to_network(i); return i; } T operator=(T i) { m_integer = aux::host_to_network(i); return i; }
operator T() const { return aux::network_to_host(m_integer); } operator T() const { return aux::network_to_host(m_integer); }
@ -65,9 +60,7 @@ typedef big_endian<int32> int32_big;
typedef big_endian<uint32> uint32_big; typedef big_endian<uint32> uint32_big;
typedef big_endian<uint16> uint16_big; typedef big_endian<uint16> uint16_big;
#ifndef __GNUC__ #pragma pack(pop)
#pragma pack(pop)
#endif
template<typename T> static inline void zeromem(T *a, size_t count = 1) { memset(a, 0, count * sizeof(T)); } template<typename T> static inline void zeromem(T *a, size_t count = 1) { memset(a, 0, count * sizeof(T)); }

View File

@ -92,14 +92,9 @@ char addrbuf[65];
char addrbuf2[65]; char addrbuf2[65];
#define addrfmt(x, s) x.fmt(s, sizeof(s)) #define addrfmt(x, s) x.fmt(s, sizeof(s))
#ifdef __GNUC__ #pragma pack(push,1)
#define PACKED_ATTRIBUTE __attribute__((__packed__))
#else
#define PACKED_ATTRIBUTE
#pragma pack(push,1)
#endif
struct PACKED_ATTRIBUTE PackedSockAddr { struct PackedSockAddr {
// The values are always stored here in network byte order // The values are always stored here in network byte order
union { union {
@ -197,7 +192,7 @@ struct PACKED_ATTRIBUTE PackedSockAddr {
} }
}; };
struct PACKED_ATTRIBUTE RST_Info { struct RST_Info {
PackedSockAddr addr; PackedSockAddr addr;
uint32 connid; uint32 connid;
uint32 timestamp; uint32 timestamp;
@ -216,7 +211,7 @@ struct PACKED_ATTRIBUTE RST_Info {
#define PACKET_SIZE_BIG 1400 #define PACKET_SIZE_BIG 1400
#define PACKET_SIZE_HUGE_BUCKET 4 #define PACKET_SIZE_HUGE_BUCKET 4
struct PACKED_ATTRIBUTE PacketFormat { struct PacketFormat {
// connection ID // connection ID
uint32_big connid; uint32_big connid;
uint32_big tv_sec; uint32_big tv_sec;
@ -234,21 +229,21 @@ struct PACKED_ATTRIBUTE PacketFormat {
uint16_big ack_nr; uint16_big ack_nr;
}; };
struct PACKED_ATTRIBUTE PacketFormatAck { struct PacketFormatAck {
PacketFormat pf; PacketFormat pf;
byte ext_next; byte ext_next;
byte ext_len; byte ext_len;
byte acks[4]; byte acks[4];
}; };
struct PACKED_ATTRIBUTE PacketFormatExtensions { struct PacketFormatExtensions {
PacketFormat pf; PacketFormat pf;
byte ext_next; byte ext_next;
byte ext_len; byte ext_len;
byte extensions[8]; byte extensions[8];
}; };
struct PACKED_ATTRIBUTE PacketFormatV1 { struct PacketFormatV1 {
// packet_type (4 high bits) // packet_type (4 high bits)
// protocol version (4 low bits) // protocol version (4 low bits)
byte ver_type; byte ver_type;
@ -271,23 +266,21 @@ struct PACKED_ATTRIBUTE PacketFormatV1 {
uint16_big ack_nr; uint16_big ack_nr;
}; };
struct PACKED_ATTRIBUTE PacketFormatAckV1 { struct PacketFormatAckV1 {
PacketFormatV1 pf; PacketFormatV1 pf;
byte ext_next; byte ext_next;
byte ext_len; byte ext_len;
byte acks[4]; byte acks[4];
}; };
struct PACKED_ATTRIBUTE PacketFormatExtensionsV1 { struct PacketFormatExtensionsV1 {
PacketFormatV1 pf; PacketFormatV1 pf;
byte ext_next; byte ext_next;
byte ext_len; byte ext_len;
byte extensions[8]; byte extensions[8];
}; };
#ifndef __GNUC__ #pragma pack(pop)
#pragma pack(pop)
#endif
enum { enum {
ST_DATA = 0, // Data packet. ST_DATA = 0, // Data packet.