aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2014-04-03 14:50:04 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2014-04-03 14:50:04 +0000
commitadde4d1462dd4c0ac39f7856da3e0659434cb03a (patch)
treea6ba1c76cc8dab4c4d8fd26dc84dce09279ba61c /main
parent4381ab73f5eac877124722f68ad2e8bd178746d8 (diff)
downloadaports-adde4d1462dd4c0ac39f7856da3e0659434cb03a.tar.bz2
aports-adde4d1462dd4c0ac39f7856da3e0659434cb03a.tar.xz
main/musl: backport hsearch from upstream
needed for drbd
Diffstat (limited to 'main')
-rw-r--r--main/musl/APKBUILD10
-rw-r--r--main/musl/hsearch-1.patch213
-rw-r--r--main/musl/hsearch-2.patch138
3 files changed, 360 insertions, 1 deletions
diff --git a/main/musl/APKBUILD b/main/musl/APKBUILD
index e8a48e32f7..c3bf4bb42e 100644
--- a/main/musl/APKBUILD
+++ b/main/musl/APKBUILD
@@ -2,7 +2,7 @@
# Maintainer: Timo Teräs <timo.teras@iki.fi>
pkgname=musl
pkgver=1.0.0
-pkgrel=3
+pkgrel=4
pkgdesc="the musl c library (libc) implementation"
url="http://www.musl-libc.org/"
arch="all"
@@ -17,6 +17,8 @@ source="http://www.musl-libc.org/releases/musl-$pkgver.tar.gz
0001-v1.0.0-to-2b74315d.patch
1001-add-basic-dns-record-parsing-functions.patch
1002-use-armv6-opcodes-for-atomics-if-targetting-such-arc.patch
+ hsearch-1.patch
+ hsearch-2.patch
getopt_long.c
__stack_chk_fail_local.c
@@ -116,6 +118,8 @@ md5sums="e54664fdf211d27737e328c4462b545e musl-1.0.0.tar.gz
d081fc3424229c639e636be2dd00d221 0001-v1.0.0-to-2b74315d.patch
a3810683ef61ac27e2f6ec9801280c81 1001-add-basic-dns-record-parsing-functions.patch
e2bdd9d7d057c28c1f45c8930e40276a 1002-use-armv6-opcodes-for-atomics-if-targetting-such-arc.patch
+f82a3988422584cda506ca1ca59114ef hsearch-1.patch
+6045d289d7b1b12c02ce583f407fdb17 hsearch-2.patch
61c6c1e84ed1df82abbe6d75e90cf21c getopt_long.c
0df687757221bbb0fc1aa67f1bd646f9 __stack_chk_fail_local.c
7b391300396e58fe9073866b5a80cfe8 getconf.c
@@ -125,6 +129,8 @@ sha256sums="1ad7f45d2972daff19c9e6a92714e6d70f4aad003cd8c3d1e6113432114c1a32 mu
aa632b635d472d5a6a49800899ce34cddc89a63a489690faa683d08622b9cd60 0001-v1.0.0-to-2b74315d.patch
758390768b1bc4159d56908ca332b9640cd0552ed3b4b2b8d4a6d499c54c11a1 1001-add-basic-dns-record-parsing-functions.patch
2069f2de91fc584282fefef8618808f3182837ec3f09848028b9480cfc90d46f 1002-use-armv6-opcodes-for-atomics-if-targetting-such-arc.patch
+35c93d9e14fc136b6f31940425b43bb42de6ea64045b6cacb5fae41625049bb6 hsearch-1.patch
+c501b141a6d401dbb5a78ba3758a4b7c78907da11052878a2a73ca81554ef740 hsearch-2.patch
d9b644ec20bc33e81a7c52b9fcf7973d835923a69faf50f03db45534b811bd96 getopt_long.c
299a7d75a09de3e2e11e7fb4acc3182e4a14e868093d2f30938fce9bfcff13da __stack_chk_fail_local.c
530ea449f93d53fafcb377fa0a23a7564f2961e49c07a8fdef6c960110317301 getconf.c
@@ -134,6 +140,8 @@ sha512sums="c76cbfe60cbe9b1ceb1faedddf2dcce0f11c942c8f74e4f217efe63e8e1d7be70fcb
e04f0f9de2859d18cb13aa8bfd839cc757aa9d835f133e46b48a760c7e689a92c641abe1e84dcaab6134c22500603e66d9a880f9b80b77e36a063348f5879878 0001-v1.0.0-to-2b74315d.patch
dad965258daf69371b844f76bfe5a914b0eca0ca76f3fc340b8fd7acf598b5f87bbe6d68b1f43ed0293ee0ed3bfd85d5173ccc169aa6265646248d5b8a906708 1001-add-basic-dns-record-parsing-functions.patch
afbec2ae86e3406cc4116b217ecee7fbd0b995c6635a455e6166cb04798968abbd5be33161e3bc19e2665cdec07a4249ca3b7c535da97922c03d8d6ac6535a76 1002-use-armv6-opcodes-for-atomics-if-targetting-such-arc.patch
+c226aec49a7935de3d31c708da7c3493a67153cc443c4b3fe534cbe4442bb66cc07aa73cd6a9651f3088b8951ad8849bc9adcba89ce9be26398ed7c51c5c1701 hsearch-1.patch
+43583e071487813b6f0f8759c92b2c1ef7523fd33076040e545cdd645e9a6aa4274611cb3b4a7b401f4a99b455cf7637c3dc26c97255bbde79c4eef900d2c224 hsearch-2.patch
140f3f20d30bd95ebce8c41b8cc7f616c6cbedf4ea06c729c21014e74f6043796825cc40ebc5180620ea38173afdba23f09ebf6d8b11fa05440b14d23764fca9 getopt_long.c
062bb49fa54839010acd4af113e20f7263dde1c8a2ca359b5fb2661ef9ed9d84a0f7c3bc10c25dcfa10bb3c5a4874588dff636ac43d5dbb3d748d75400756d0b __stack_chk_fail_local.c
d638cdd02371351190fd0545fb83f44b822fa8c930e9fb47ef93d32a1aaee27641f875e10fa2e9833f1a56dfc2055fb89932a89c88da3e2eb17529bca58f5182 getconf.c
diff --git a/main/musl/hsearch-1.patch b/main/musl/hsearch-1.patch
new file mode 100644
index 0000000000..ced1cc4af5
--- /dev/null
+++ b/main/musl/hsearch-1.patch
@@ -0,0 +1,213 @@
+From fe1ba7dbf187e34985896b40d469d84a7a4a98d0 Mon Sep 17 00:00:00 2001
+From: sin <sin@2f30.org>
+Date: Tue, 25 Mar 2014 16:37:51 +0000
+Subject: implement hcreate_r, hdestroy_r and hsearch_r
+
+the size and alignment of struct hsearch_data are matched to the glibc
+definition for binary compatibility. the members of the structure do
+not match, which should not be a problem as long as applications
+correctly treat the structure as opaque.
+
+unlike the glibc implementation, this version of hcreate_r does not
+require the caller to zero-fill the structure before use.
+---
+diff --git a/include/search.h b/include/search.h
+index 27f6107..02e407e 100644
+--- a/include/search.h
++++ b/include/search.h
+@@ -22,6 +22,18 @@ int hcreate(size_t);
+ void hdestroy(void);
+ ENTRY *hsearch(ENTRY, ACTION);
+
++#ifdef _GNU_SOURCE
++struct hsearch_data {
++ struct __tab *__tab;
++ unsigned int __unused1;
++ unsigned int __unused2;
++};
++
++int hcreate_r(size_t, struct hsearch_data *);
++void hdestroy_r(struct hsearch_data *);
++int hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *);
++#endif
++
+ void insque(void *, void *);
+ void remque(void *);
+
+diff --git a/src/search/hsearch.c b/src/search/hsearch.c
+index 6fe5ced..88edb26 100644
+--- a/src/search/hsearch.c
++++ b/src/search/hsearch.c
+@@ -1,6 +1,8 @@
++#define _GNU_SOURCE
+ #include <stdlib.h>
+ #include <string.h>
+ #include <search.h>
++#include "libc.h"
+
+ /*
+ open addressing hash table with 2^n table size
+@@ -19,9 +21,17 @@ struct elem {
+ size_t hash;
+ };
+
+-static size_t mask;
+-static size_t used;
+-static struct elem *tab;
++struct __tab {
++ struct elem *elems;
++ size_t mask;
++ size_t used;
++};
++
++static struct hsearch_data htab;
++
++int __hcreate_r(size_t, struct hsearch_data *);
++void __hdestroy_r(struct hsearch_data *);
++int __hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *);
+
+ static size_t keyhash(char *k)
+ {
+@@ -33,29 +43,29 @@ static size_t keyhash(char *k)
+ return h;
+ }
+
+-static int resize(size_t nel)
++static int resize(size_t nel, struct hsearch_data *htab)
+ {
+ size_t newsize;
+ size_t i, j;
+ struct elem *e, *newe;
+- struct elem *oldtab = tab;
+- struct elem *oldend = tab + mask + 1;
++ struct elem *oldtab = htab->__tab->elems;
++ struct elem *oldend = htab->__tab->elems + htab->__tab->mask + 1;
+
+ if (nel > MAXSIZE)
+ nel = MAXSIZE;
+ for (newsize = MINSIZE; newsize < nel; newsize *= 2);
+- tab = calloc(newsize, sizeof *tab);
+- if (!tab) {
+- tab = oldtab;
++ htab->__tab->elems = calloc(newsize, sizeof *htab->__tab->elems);
++ if (!htab->__tab->elems) {
++ htab->__tab->elems = oldtab;
+ return 0;
+ }
+- mask = newsize - 1;
++ htab->__tab->mask = newsize - 1;
+ if (!oldtab)
+ return 1;
+ for (e = oldtab; e < oldend; e++)
+ if (e->item.key) {
+ for (i=e->hash,j=1; ; i+=j++) {
+- newe = tab + (i & mask);
++ newe = htab->__tab->elems + (i & htab->__tab->mask);
+ if (!newe->item.key)
+ break;
+ }
+@@ -67,27 +77,21 @@ static int resize(size_t nel)
+
+ int hcreate(size_t nel)
+ {
+- mask = 0;
+- used = 0;
+- tab = 0;
+- return resize(nel);
++ return __hcreate_r(nel, &htab);
+ }
+
+ void hdestroy(void)
+ {
+- free(tab);
+- tab = 0;
+- mask = 0;
+- used = 0;
++ __hdestroy_r(&htab);
+ }
+
+-static struct elem *lookup(char *key, size_t hash)
++static struct elem *lookup(char *key, size_t hash, struct hsearch_data *htab)
+ {
+ size_t i, j;
+ struct elem *e;
+
+ for (i=hash,j=1; ; i+=j++) {
+- e = tab + (i & mask);
++ e = htab->__tab->elems + (i & htab->__tab->mask);
+ if (!e->item.key ||
+ (e->hash==hash && strcmp(e->item.key, key)==0))
+ break;
+@@ -97,22 +101,61 @@ static struct elem *lookup(char *key, size_t hash)
+
+ ENTRY *hsearch(ENTRY item, ACTION action)
+ {
++ ENTRY *e;
++
++ __hsearch_r(item, action, &e, &htab);
++ return e;
++}
++
++int __hcreate_r(size_t nel, struct hsearch_data *htab)
++{
++ int r;
++
++ htab->__tab = calloc(1, sizeof *htab->__tab);
++ if (!htab->__tab)
++ return 0;
++ r = resize(nel, htab);
++ if (r == 0) {
++ free(htab->__tab);
++ htab->__tab = 0;
++ }
++ return r;
++}
++weak_alias(__hcreate_r, hcreate_r);
++
++void __hdestroy_r(struct hsearch_data *htab)
++{
++ if (htab->__tab) free(htab->__tab->elems);
++ free(htab->__tab);
++ htab->__tab = 0;
++}
++weak_alias(__hdestroy_r, hdestroy_r);
++
++int __hsearch_r(ENTRY item, ACTION action, ENTRY **retval, struct hsearch_data *htab)
++{
+ size_t hash = keyhash(item.key);
+- struct elem *e = lookup(item.key, hash);
++ struct elem *e = lookup(item.key, hash, htab);
+
+- if (e->item.key)
+- return &e->item;
+- if (action == FIND)
++ if (e->item.key) {
++ *retval = &e->item;
++ return 1;
++ }
++ if (action == FIND) {
++ *retval = 0;
+ return 0;
++ }
+ e->item = item;
+ e->hash = hash;
+- if (++used > mask - mask/4) {
+- if (!resize(2*used)) {
+- used--;
++ if (++htab->__tab->used > htab->__tab->mask - htab->__tab->mask/4) {
++ if (!resize(2*htab->__tab->used, htab)) {
++ htab->__tab->used--;
+ e->item.key = 0;
++ *retval = 0;
+ return 0;
+ }
+- e = lookup(item.key, hash);
++ e = lookup(item.key, hash, htab);
+ }
+- return &e->item;
++ *retval = &e->item;
++ return 1;
+ }
++weak_alias(__hsearch_r, hsearch_r);
+--
+cgit v0.9.0.3-65-g4555
diff --git a/main/musl/hsearch-2.patch b/main/musl/hsearch-2.patch
new file mode 100644
index 0000000000..3f795dce87
--- /dev/null
+++ b/main/musl/hsearch-2.patch
@@ -0,0 +1,138 @@
+From 141d3b5c2a93dd48096a13ce051d09eaf3ec0b4a Mon Sep 17 00:00:00 2001
+From: sin <sin@2f30.org>
+Date: Thu, 27 Mar 2014 11:20:17 +0000
+Subject: remove struct elem entirely from hsearch.c
+
+There are two changes here, both of which make sense to be done in a
+single patch:
+
+- Remove hash from struct elem and compute it at runtime wherever
+ necessary.
+- Eliminate struct elem and use ENTRY directly.
+
+As a result we cut down on the memory usage as each element in the
+hash table now contains only an ENTRY not an ENTRY + size_t for the
+hash. The downside is that the hash needs to be computed at runtime.
+---
+diff --git a/src/search/hsearch.c b/src/search/hsearch.c
+index 88edb26..5c89651 100644
+--- a/src/search/hsearch.c
++++ b/src/search/hsearch.c
+@@ -16,13 +16,8 @@ with the posix api items cannot be iterated and length cannot be queried
+ #define MINSIZE 8
+ #define MAXSIZE ((size_t)-1/2 + 1)
+
+-struct elem {
+- ENTRY item;
+- size_t hash;
+-};
+-
+ struct __tab {
+- struct elem *elems;
++ ENTRY *entries;
+ size_t mask;
+ size_t used;
+ };
+@@ -47,26 +42,26 @@ static int resize(size_t nel, struct hsearch_data *htab)
+ {
+ size_t newsize;
+ size_t i, j;
+- struct elem *e, *newe;
+- struct elem *oldtab = htab->__tab->elems;
+- struct elem *oldend = htab->__tab->elems + htab->__tab->mask + 1;
++ ENTRY *e, *newe;
++ ENTRY *oldtab = htab->__tab->entries;
++ ENTRY *oldend = htab->__tab->entries + htab->__tab->mask + 1;
+
+ if (nel > MAXSIZE)
+ nel = MAXSIZE;
+ for (newsize = MINSIZE; newsize < nel; newsize *= 2);
+- htab->__tab->elems = calloc(newsize, sizeof *htab->__tab->elems);
+- if (!htab->__tab->elems) {
+- htab->__tab->elems = oldtab;
++ htab->__tab->entries = calloc(newsize, sizeof *htab->__tab->entries);
++ if (!htab->__tab->entries) {
++ htab->__tab->entries = oldtab;
+ return 0;
+ }
+ htab->__tab->mask = newsize - 1;
+ if (!oldtab)
+ return 1;
+ for (e = oldtab; e < oldend; e++)
+- if (e->item.key) {
+- for (i=e->hash,j=1; ; i+=j++) {
+- newe = htab->__tab->elems + (i & htab->__tab->mask);
+- if (!newe->item.key)
++ if (e->key) {
++ for (i=keyhash(e->key),j=1; ; i+=j++) {
++ newe = htab->__tab->entries + (i & htab->__tab->mask);
++ if (!newe->key)
+ break;
+ }
+ *newe = *e;
+@@ -85,15 +80,14 @@ void hdestroy(void)
+ __hdestroy_r(&htab);
+ }
+
+-static struct elem *lookup(char *key, size_t hash, struct hsearch_data *htab)
++static ENTRY *lookup(char *key, size_t hash, struct hsearch_data *htab)
+ {
+ size_t i, j;
+- struct elem *e;
++ ENTRY *e;
+
+ for (i=hash,j=1; ; i+=j++) {
+- e = htab->__tab->elems + (i & htab->__tab->mask);
+- if (!e->item.key ||
+- (e->hash==hash && strcmp(e->item.key, key)==0))
++ e = htab->__tab->entries + (i & htab->__tab->mask);
++ if (!e->key || strcmp(e->key, key) == 0)
+ break;
+ }
+ return e;
+@@ -125,7 +119,7 @@ weak_alias(__hcreate_r, hcreate_r);
+
+ void __hdestroy_r(struct hsearch_data *htab)
+ {
+- if (htab->__tab) free(htab->__tab->elems);
++ if (htab->__tab) free(htab->__tab->entries);
+ free(htab->__tab);
+ htab->__tab = 0;
+ }
+@@ -134,28 +128,27 @@ weak_alias(__hdestroy_r, hdestroy_r);
+ int __hsearch_r(ENTRY item, ACTION action, ENTRY **retval, struct hsearch_data *htab)
+ {
+ size_t hash = keyhash(item.key);
+- struct elem *e = lookup(item.key, hash, htab);
++ ENTRY *e = lookup(item.key, hash, htab);
+
+- if (e->item.key) {
+- *retval = &e->item;
++ if (e->key) {
++ *retval = e;
+ return 1;
+ }
+ if (action == FIND) {
+ *retval = 0;
+ return 0;
+ }
+- e->item = item;
+- e->hash = hash;
++ *e = item;
+ if (++htab->__tab->used > htab->__tab->mask - htab->__tab->mask/4) {
+ if (!resize(2*htab->__tab->used, htab)) {
+ htab->__tab->used--;
+- e->item.key = 0;
++ e->key = 0;
+ *retval = 0;
+ return 0;
+ }
+ e = lookup(item.key, hash, htab);
+ }
+- *retval = &e->item;
++ *retval = e;
+ return 1;
+ }
+ weak_alias(__hsearch_r, hsearch_r);
+--
+cgit v0.9.0.3-65-g4555