aboutsummaryrefslogtreecommitdiffstats
path: root/package/system/opkg/patches/020-avoid_getline.patch
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2017-02-16 17:36:47 +0100
committerJo-Philipp Wich <jo@mein.io>2017-02-19 19:08:46 +0100
commitb65dc04712dfb8cc7bb9036c7c73b0cead6dd7c9 (patch)
tree6ebef4cc7d786698b57488d1d3d929dd7c398560 /package/system/opkg/patches/020-avoid_getline.patch
parent84ceca514841dd6d4705dc27d2104ee0aa18b9e1 (diff)
downloadupstream-b65dc04712dfb8cc7bb9036c7c73b0cead6dd7c9.tar.gz
upstream-b65dc04712dfb8cc7bb9036c7c73b0cead6dd7c9.tar.bz2
upstream-b65dc04712dfb8cc7bb9036c7c73b0cead6dd7c9.zip
opkg: switch to own fork to improve memory usage
Switch to our own fork of opkg to significantly reduce the required amount of memory when updating lists or installing packages. Preliminary tests showed a usage drop of about 90% during these operations, from ~3.7MB with unmodified opkg to ~360KB with our custom fork. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'package/system/opkg/patches/020-avoid_getline.patch')
-rw-r--r--package/system/opkg/patches/020-avoid_getline.patch317
1 files changed, 0 insertions, 317 deletions
diff --git a/package/system/opkg/patches/020-avoid_getline.patch b/package/system/opkg/patches/020-avoid_getline.patch
deleted file mode 100644
index 8a1a8f6272..0000000000
--- a/package/system/opkg/patches/020-avoid_getline.patch
+++ /dev/null
@@ -1,317 +0,0 @@
---- a/libopkg/parse_util.c
-+++ b/libopkg/parse_util.c
-@@ -22,6 +22,7 @@
- #include "libbb/libbb.h"
-
- #include "parse_util.h"
-+#include "pkg_parse.h"
-
- int
- is_field(const char *type, const char *line)
-@@ -86,3 +87,84 @@ parse_list(const char *raw, unsigned int
- *count = line_count;
- return depends;
- }
-+
-+int
-+parse_from_stream_nomalloc(parse_line_t parse_line, void *item, FILE *fp, uint mask,
-+ char **buf0, size_t buf0len)
-+{
-+ int ret, lineno;
-+ char *buf, *nl;
-+ size_t buflen;
-+
-+ lineno = 1;
-+ ret = 0;
-+
-+ buflen = buf0len;
-+ buf = *buf0;
-+ buf[0] = '\0';
-+
-+ while (1) {
-+ if (fgets(buf, (int)buflen, fp) == NULL) {
-+ if (ferror(fp)) {
-+ opkg_perror(ERROR, "fgets");
-+ ret = -1;
-+ } else if (strlen(*buf0) == buf0len-1) {
-+ opkg_msg(ERROR, "Missing new line character"
-+ " at end of file!\n");
-+ parse_line(item, *buf0, mask);
-+ }
-+ break;
-+ }
-+
-+ nl = strchr(buf, '\n');
-+ if (nl == NULL) {
-+ if (strlen(buf) < buflen-1) {
-+ /*
-+ * Line could be exactly buflen-1 long and
-+ * missing a newline, but we won't know until
-+ * fgets fails to read more data.
-+ */
-+ opkg_msg(ERROR, "Missing new line character"
-+ " at end of file!\n");
-+ parse_line(item, *buf0, mask);
-+ break;
-+ }
-+ if (buf0len >= EXCESSIVE_LINE_LEN) {
-+ opkg_msg(ERROR, "Excessively long line at "
-+ "%d. Corrupt file?\n",
-+ lineno);
-+ ret = -1;
-+ break;
-+ }
-+
-+ /*
-+ * Realloc and point buf past the data already read,
-+ * at the NULL terminator inserted by fgets.
-+ * |<--------------- buf0len ----------------->|
-+ * | |<------- buflen ---->|
-+ * |---------------------|---------------------|
-+ * buf0 buf
-+ */
-+ buflen = buf0len +1;
-+ buf0len *= 2;
-+ *buf0 = xrealloc(*buf0, buf0len);
-+ buf = *buf0 + buflen -2;
-+
-+ continue;
-+ }
-+
-+ *nl = '\0';
-+
-+ lineno++;
-+
-+ if (parse_line(item, *buf0, mask))
-+ break;
-+
-+ buf = *buf0;
-+ buflen = buf0len;
-+ buf[0] = '\0';
-+ }
-+
-+ return ret;
-+}
-+
---- a/libopkg/parse_util.h
-+++ b/libopkg/parse_util.h
-@@ -22,4 +22,8 @@ int is_field(const char *type, const cha
- char *parse_simple(const char *type, const char *line);
- char **parse_list(const char *raw, unsigned int *count, const char sep, int skip_field);
-
-+typedef int (*parse_line_t)(void *, const char *, uint);
-+int parse_from_stream_nomalloc(parse_line_t parse_line, void *item, FILE *fp, uint mask,
-+ char **buf0, size_t buf0len);
-+
- #endif
---- a/libopkg/pkg_hash.c
-+++ b/libopkg/pkg_hash.c
-@@ -23,6 +23,7 @@
- #include "opkg_message.h"
- #include "pkg_vec.h"
- #include "pkg_hash.h"
-+#include "parse_util.h"
- #include "pkg_parse.h"
- #include "opkg_utils.h"
- #include "sprintf_alloc.h"
-@@ -119,8 +120,14 @@ pkg_hash_add_from_file(const char *file_
- pkg->src = src;
- pkg->dest = dest;
-
-- ret = pkg_parse_from_stream_nomalloc(pkg, fp, 0,
-+ ret = parse_from_stream_nomalloc(pkg_parse_line, pkg, fp, 0,
- &buf, len);
-+
-+ if (pkg->name == NULL) {
-+ /* probably just a blank line */
-+ ret = 1;
-+ }
-+
- if (ret) {
- pkg_deinit (pkg);
- free(pkg);
---- a/libopkg/pkg_parse.c
-+++ b/libopkg/pkg_parse.c
-@@ -104,9 +104,11 @@ get_arch_priority(const char *arch)
- return 0;
- }
-
--static int
--pkg_parse_line(pkg_t *pkg, const char *line, uint mask)
-+int
-+pkg_parse_line(void *ptr, const char *line, uint mask)
- {
-+ pkg_t *pkg = (pkg_t *) ptr;
-+
- /* these flags are a bit hackish... */
- static int reading_conffiles = 0, reading_description = 0;
- int ret = 0;
-@@ -266,91 +268,6 @@ dont_reset_flags:
- }
-
- int
--pkg_parse_from_stream_nomalloc(pkg_t *pkg, FILE *fp, uint mask,
-- char **buf0, size_t buf0len)
--{
-- int ret, lineno;
-- char *buf, *nl;
-- size_t buflen;
--
-- lineno = 1;
-- ret = 0;
--
-- buflen = buf0len;
-- buf = *buf0;
-- buf[0] = '\0';
--
-- while (1) {
-- if (fgets(buf, (int)buflen, fp) == NULL) {
-- if (ferror(fp)) {
-- opkg_perror(ERROR, "fgets");
-- ret = -1;
-- } else if (strlen(*buf0) == buf0len-1) {
-- opkg_msg(ERROR, "Missing new line character"
-- " at end of file!\n");
-- pkg_parse_line(pkg, *buf0, mask);
-- }
-- break;
-- }
--
-- nl = strchr(buf, '\n');
-- if (nl == NULL) {
-- if (strlen(buf) < buflen-1) {
-- /*
-- * Line could be exactly buflen-1 long and
-- * missing a newline, but we won't know until
-- * fgets fails to read more data.
-- */
-- opkg_msg(ERROR, "Missing new line character"
-- " at end of file!\n");
-- pkg_parse_line(pkg, *buf0, mask);
-- break;
-- }
-- if (buf0len >= EXCESSIVE_LINE_LEN) {
-- opkg_msg(ERROR, "Excessively long line at "
-- "%d. Corrupt file?\n",
-- lineno);
-- ret = -1;
-- break;
-- }
--
-- /*
-- * Realloc and point buf past the data already read,
-- * at the NULL terminator inserted by fgets.
-- * |<--------------- buf0len ----------------->|
-- * | |<------- buflen ---->|
-- * |---------------------|---------------------|
-- * buf0 buf
-- */
-- buflen = buf0len +1;
-- buf0len *= 2;
-- *buf0 = xrealloc(*buf0, buf0len);
-- buf = *buf0 + buflen -2;
--
-- continue;
-- }
--
-- *nl = '\0';
--
-- lineno++;
--
-- if (pkg_parse_line(pkg, *buf0, mask))
-- break;
--
-- buf = *buf0;
-- buflen = buf0len;
-- buf[0] = '\0';
-- }
--
-- if (pkg->name == NULL) {
-- /* probably just a blank line */
-- ret = 1;
-- }
--
-- return ret;
--}
--
--int
- pkg_parse_from_stream(pkg_t *pkg, FILE *fp, uint mask)
- {
- int ret;
-@@ -358,8 +275,13 @@ pkg_parse_from_stream(pkg_t *pkg, FILE *
- const size_t len = 4096;
-
- buf = xmalloc(len);
-- ret = pkg_parse_from_stream_nomalloc(pkg, fp, mask, &buf, len);
-+ ret = parse_from_stream_nomalloc(pkg_parse_line, pkg, fp, mask, &buf, len);
- free(buf);
-
-+ if (pkg->name == NULL) {
-+ /* probably just a blank line */
-+ ret = 1;
-+ }
-+
- return ret;
- }
---- a/libopkg/pkg_parse.h
-+++ b/libopkg/pkg_parse.h
-@@ -18,10 +18,11 @@
- #ifndef PKG_PARSE_H
- #define PKG_PARSE_H
-
-+#include "pkg.h"
-+
- int parse_version(pkg_t *pkg, const char *raw);
- int pkg_parse_from_stream(pkg_t *pkg, FILE *fp, uint mask);
--int pkg_parse_from_stream_nomalloc(pkg_t *pkg, FILE *fp, uint mask,
-- char **buf0, size_t buf0len);
-+int pkg_parse_line(void *ptr, const char *line, uint mask);
-
- #define EXCESSIVE_LINE_LEN (4096 << 8)
-
---- a/libopkg/release_parse.c
-+++ b/libopkg/release_parse.c
-@@ -23,8 +23,10 @@
- #include "parse_util.h"
-
- static int
--release_parse_line(release_t *release, const char *line)
-+release_parse_line(void *ptr, const char *line, uint mask)
- {
-+ release_t *release = (release_t *) ptr;
-+
- int ret = 0;
- unsigned int count = 0;
- char **list = 0;
-@@ -111,25 +113,14 @@ dont_reset_flags:
- int
- release_parse_from_stream(release_t *release, FILE *fp)
- {
-- int ret = 0;
-- char *buf = NULL;
-- size_t buflen, nread;
--
-- nread = getline(&buf, &buflen, fp);
-- while ( nread != -1 ) {
-- if (buf[nread-1] == '\n') buf[nread-1] = '\0';
-- if (release_parse_line(release, buf))
-- opkg_msg(DEBUG, "Failed to parse release line for %s:\n\t%s\n",
-- release->name, buf);
-- nread = getline(&buf, &buflen, fp);
-- }
--
-- if (!feof(fp)) {
-- opkg_perror(ERROR, "Problems reading Release file for %sd\n", release->name);
-- ret = -1;
-- }
-+ int ret;
-+ char *buf;
-+ const size_t len = 4096;
-
-+ buf = xmalloc(len);
-+ ret = parse_from_stream_nomalloc(release_parse_line, release, fp, 0, &buf, len);
- free(buf);
-+
- return ret;
- }
-