]> granicus.if.org Git - transmission/commitdiff
(trunk, libutp) #4260 "uTP not working when compiler doesn't honor 'pragma pack'...
authorJordan Lee <jordan@transmissionbt.com>
Sat, 30 Jul 2011 22:15:32 +0000 (22:15 +0000)
committerJordan Lee <jordan@transmissionbt.com>
Sat, 30 Jul 2011 22:15:32 +0000 (22:15 +0000)
third-party/libutp/templates.h
third-party/libutp/utp.cpp

index 41ce50a7e503e21288ecdfbc6ec0b890a24ebf0a..9e98fb3d7234a9e921bf2d37c6591a00a10b501a 100644 (file)
@@ -35,12 +35,7 @@ template <typename T> 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 <class T>
-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> int32_big;
 typedef big_endian<uint32> uint32_big;
 typedef big_endian<uint16> uint16_big;
 
-#ifndef __GNUC__
- #pragma pack(pop)
-#endif
+#pragma pack(pop)
 
 template<typename T> static inline void zeromem(T *a, size_t count = 1) { memset(a, 0, count * sizeof(T)); }
 
index db99c8ffa2e9df03306a68c56af546ec45e2d149..c5f431ee5bfde0e6edbc5275caf83df983750873 100644 (file)
@@ -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.