From cdb95995e8bb896158110f666deb0ef32e8991c5 Mon Sep 17 00:00:00 2001 From: Jordan Lee Date: Sat, 30 Jul 2011 22:15:32 +0000 Subject: [PATCH] (trunk, libutp) #4260 "uTP not working when compiler doesn't honor 'pragma pack'" -- apply alus' revised patch for testing. --- third-party/libutp/templates.h | 13 +++---------- third-party/libutp/utp.cpp | 27 ++++++++++----------------- 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/third-party/libutp/templates.h b/third-party/libutp/templates.h index 41ce50a7e..9e98fb3d7 100644 --- a/third-party/libutp/templates.h +++ b/third-party/libutp/templates.h @@ -35,12 +35,7 @@ template static inline T clamp(T v, T mi, T ma) return v; } -#ifdef __GNUC__ - #define PACKED_ATTRIBUTE __attribute__((__packed__)) -#else - #define PACKED_ATTRIBUTE - #pragma pack(push,1) -#endif +#pragma pack(push,1) namespace aux { @@ -53,7 +48,7 @@ namespace aux } template -struct PACKED_ATTRIBUTE big_endian +struct big_endian { T operator=(T i) { m_integer = aux::host_to_network(i); return i; } operator T() const { return aux::network_to_host(m_integer); } @@ -65,9 +60,7 @@ typedef big_endian int32_big; typedef big_endian uint32_big; typedef big_endian uint16_big; -#ifndef __GNUC__ - #pragma pack(pop) -#endif +#pragma pack(pop) template static inline void zeromem(T *a, size_t count = 1) { memset(a, 0, count * sizeof(T)); } diff --git a/third-party/libutp/utp.cpp b/third-party/libutp/utp.cpp index db99c8ffa..c5f431ee5 100644 --- a/third-party/libutp/utp.cpp +++ b/third-party/libutp/utp.cpp @@ -92,14 +92,9 @@ char addrbuf[65]; char addrbuf2[65]; #define addrfmt(x, s) x.fmt(s, sizeof(s)) -#ifdef __GNUC__ - #define PACKED_ATTRIBUTE __attribute__((__packed__)) -#else - #define PACKED_ATTRIBUTE - #pragma pack(push,1) -#endif +#pragma pack(push,1) -struct PACKED_ATTRIBUTE PackedSockAddr { +struct PackedSockAddr { // The values are always stored here in network byte order union { @@ -197,7 +192,7 @@ struct PACKED_ATTRIBUTE PackedSockAddr { } }; -struct PACKED_ATTRIBUTE RST_Info { +struct RST_Info { PackedSockAddr addr; uint32 connid; uint32 timestamp; @@ -216,7 +211,7 @@ struct PACKED_ATTRIBUTE RST_Info { #define PACKET_SIZE_BIG 1400 #define PACKET_SIZE_HUGE_BUCKET 4 -struct PACKED_ATTRIBUTE PacketFormat { +struct PacketFormat { // connection ID uint32_big connid; uint32_big tv_sec; @@ -234,21 +229,21 @@ struct PACKED_ATTRIBUTE PacketFormat { uint16_big ack_nr; }; -struct PACKED_ATTRIBUTE PacketFormatAck { +struct PacketFormatAck { PacketFormat pf; byte ext_next; byte ext_len; byte acks[4]; }; -struct PACKED_ATTRIBUTE PacketFormatExtensions { +struct PacketFormatExtensions { PacketFormat pf; byte ext_next; byte ext_len; byte extensions[8]; }; -struct PACKED_ATTRIBUTE PacketFormatV1 { +struct PacketFormatV1 { // packet_type (4 high bits) // protocol version (4 low bits) byte ver_type; @@ -271,23 +266,21 @@ struct PACKED_ATTRIBUTE PacketFormatV1 { uint16_big ack_nr; }; -struct PACKED_ATTRIBUTE PacketFormatAckV1 { +struct PacketFormatAckV1 { PacketFormatV1 pf; byte ext_next; byte ext_len; byte acks[4]; }; -struct PACKED_ATTRIBUTE PacketFormatExtensionsV1 { +struct PacketFormatExtensionsV1 { PacketFormatV1 pf; byte ext_next; byte ext_len; byte extensions[8]; }; -#ifndef __GNUC__ - #pragma pack(pop) -#endif +#pragma pack(pop) enum { ST_DATA = 0, // Data packet.