From b65dc04712dfb8cc7bb9036c7c73b0cead6dd7c9 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Thu, 16 Feb 2017 17:36:47 +0100 Subject: 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 --- .../system/opkg/patches/020-avoid_getline.patch | 317 --------------------- 1 file changed, 317 deletions(-) delete mode 100644 package/system/opkg/patches/020-avoid_getline.patch (limited to 'package/system/opkg/patches/020-avoid_getline.patch') 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; - } - -- cgit v1.2.3