[arch-commits] Commit in memcached/trunk (3 files)

Dan McGee dan at archlinux.org
Mon Jan 31 14:02:06 UTC 2011


    Date: Monday, January 31, 2011 @ 09:02:05
  Author: dan
Revision: 108468

upgpkg: memcached 1.4.5-2
rebuild for gcc 4.5.x

Added:
  memcached/trunk/fix-type-punning-issues.patch
Modified:
  memcached/trunk/ChangeLog
  memcached/trunk/PKGBUILD

-------------------------------+
 ChangeLog                     |    3 +
 PKGBUILD                      |   14 ++++---
 fix-type-punning-issues.patch |   73 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 85 insertions(+), 5 deletions(-)

Modified: ChangeLog
===================================================================
--- ChangeLog	2011-01-31 13:57:06 UTC (rev 108467)
+++ ChangeLog	2011-01-31 14:02:05 UTC (rev 108468)
@@ -1,3 +1,6 @@
+2011-01-31 Dan McGee <dan at archlinux.org>
+	* Rebuild 1.4.5 with gcc 4.5.X patch accepted upstream
+
 2009-11-14 Dan McGee <dan at archlinux.org>
 	* Bump to 1.4.3
 	* Added memcached-tool to package

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2011-01-31 13:57:06 UTC (rev 108467)
+++ PKGBUILD	2011-01-31 14:02:05 UTC (rev 108468)
@@ -3,7 +3,7 @@
 
 pkgname=memcached
 pkgver=1.4.5
-pkgrel=1
+pkgrel=2
 pkgdesc="A distributed memory object caching system"
 arch=(i686 x86_64)
 url="http://memcached.org/"
@@ -13,17 +13,20 @@
 backup=('etc/conf.d/memcached')
 source=(http://memcached.googlecode.com/files/$pkgname-$pkgver.tar.gz
         memcached.conf
-        memcached.sh)
+        memcached.sh
+        fix-type-punning-issues.patch)
+changelog=ChangeLog
 
 build() {
   cd $srcdir/$pkgname-$pkgver
+  patch -Np1 < $srcdir/fix-type-punning-issues.patch
   ./configure --prefix=/usr
-  make || return 1
+  make
 }
 
 package() {
   cd $srcdir/$pkgname-$pkgver
-  make DESTDIR=$pkgdir install || return 1
+  make DESTDIR=$pkgdir install
   install -D -m 755 scripts/memcached-tool $pkgdir/usr/bin/memcached-tool
   install -D -m 644 $srcdir/$pkgname.conf $pkgdir/etc/conf.d/$pkgname
   install -D -m 755 $srcdir/$pkgname.sh $pkgdir/etc/rc.d/$pkgname
@@ -31,4 +34,5 @@
 
 md5sums=('583441a25f937360624024f2881e5ea8'
          'bf15619930dadf0c08669566e4aa809c'
-         '65f88b69cf3112b178725af121327765')
+         '65f88b69cf3112b178725af121327765'
+         'c4f6da682cb4e7599fede4904021f4ae')

Added: fix-type-punning-issues.patch
===================================================================
--- fix-type-punning-issues.patch	                        (rev 0)
+++ fix-type-punning-issues.patch	2011-01-31 14:02:05 UTC (rev 108468)
@@ -0,0 +1,73 @@
+commit df15887584f0025e7b188e408dd3c9f638d68518
+Author: Dan McGee <dan at archlinux.org>
+Date:   Tue Nov 2 18:43:00 2010 -0500
+
+    Fix type-punning issues exposed with GCC 4.5.1
+    
+    The errors below are due to pointer magic that isn't allowed if following C
+    strict-aliasing rules:
+    
+        memcached.c: In function ‘complete_incr_bin’:
+        memcached.c:1023:16: error: dereferencing type-punned pointer will break
+        strict-aliasing rules
+        memcached.c:1044:13: error: dereferencing type-punned pointer will break
+        strict-aliasing rules
+        memcached.c:1061:17: error: dereferencing type-punned pointer will break
+        strict-aliasing rules
+    
+    Fix this by introducing a union type that allows access to the uint64_t
+    member as necessary, but doesn't add any additional length to the structure.
+    The size remains the same before and after; the only difference is explict
+    casts are now refactored into union member accesses and all compilers should
+    be happy.
+    
+    Signed-off-by: Dan McGee <dan at archlinux.org>
+
+diff --git a/memcached.h b/memcached.h
+index 4a7295b..74a6592 100644
+--- a/memcached.h
++++ b/memcached.h
+@@ -77,18 +77,22 @@
+ #define TAIL_REPAIR_TIME (3 * 3600)
+ 
+ /* warning: don't use these macros with a function, as it evals its arg twice */
+-#define ITEM_get_cas(i) ((uint64_t)(((i)->it_flags & ITEM_CAS) ? \
+-                                    *(uint64_t*)&((i)->end[0]) : 0x0))
+-#define ITEM_set_cas(i,v) { if ((i)->it_flags & ITEM_CAS) { \
+-                          *(uint64_t*)&((i)->end[0]) = v; } }
++#define ITEM_get_cas(i) (((i)->it_flags & ITEM_CAS) ? \
++        (i)->data->cas : (uint64_t)0)
+ 
+-#define ITEM_key(item) (((char*)&((item)->end[0])) \
++#define ITEM_set_cas(i,v) { \
++    if ((i)->it_flags & ITEM_CAS) { \
++        (i)->data->cas = v; \
++    } \
++}
++
++#define ITEM_key(item) (((char*)&((item)->data)) \
+          + (((item)->it_flags & ITEM_CAS) ? sizeof(uint64_t) : 0))
+ 
+-#define ITEM_suffix(item) ((char*) &((item)->end[0]) + (item)->nkey + 1 \
++#define ITEM_suffix(item) ((char*) &((item)->data) + (item)->nkey + 1 \
+          + (((item)->it_flags & ITEM_CAS) ? sizeof(uint64_t) : 0))
+ 
+-#define ITEM_data(item) ((char*) &((item)->end[0]) + (item)->nkey + 1 \
++#define ITEM_data(item) ((char*) &((item)->data) + (item)->nkey + 1 \
+          + (item)->nsuffix \
+          + (((item)->it_flags & ITEM_CAS) ? sizeof(uint64_t) : 0))
+ 
+@@ -302,7 +306,12 @@ typedef struct _stritem {
+     uint8_t         it_flags;   /* ITEM_* above */
+     uint8_t         slabs_clsid;/* which slab class we're in */
+     uint8_t         nkey;       /* key length, w/terminating null and padding */
+-    void * end[];
++    /* this odd type prevents type-punning issues when we do
++     * the little shuffle to save space when not using CAS. */
++    union {
++        uint64_t cas;
++        char end;
++    } data[];
+     /* if it_flags & ITEM_CAS we have 8 bytes CAS */
+     /* then null-terminated key */
+     /* then " flags length\r\n" (no terminating null) */




More information about the arch-commits mailing list