]> git.ipfire.org Git - people/ric9/pakfire.git/commitdiff
parser: Map the data into buffer to read it faster
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 11 Jan 2025 13:21:40 +0000 (13:21 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 11 Jan 2025 13:21:40 +0000 (13:21 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/parser.c

index fe6c88bec2706a8a00f667711aa38bc3da180e1c..e915ff2b07d3773d27a3616e35406d3fe93f33a5 100644 (file)
@@ -24,6 +24,7 @@
 #include <regex.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/mman.h>
 #include <time.h>
 #include <unistd.h>
 
@@ -915,17 +916,31 @@ OUT:
 
 int pakfire_parser_read(struct pakfire_parser* parser, FILE* f,
                struct pakfire_parser_error** error) {
-       char* data;
-       size_t len;
+       char* data = NULL;
+       size_t length = 0;
+       int fd = -EBADF;
+       int r;
 
-       int r = pakfire_read_file_into_buffer(f, &data, &len);
-       if (r)
+       // Fetch the file descriptor
+       fd = fileno(f);
+       if (fd < 0)
+               return fd;
+
+       // Map the file
+       r = pakfire_mmap(fd, &data, &length);
+       if (r < 0) {
+               ERROR(parser->ctx, "Could not map parser data into memory: %s\n", strerror(-r));
                return r;
+       }
 
-       r = pakfire_parser_parse_data(parser, data, len, error);
+       // Run the parser
+       r = pakfire_parser_parse_data(parser, data, length, error);
+       if (r < 0)
+               goto ERROR;
 
+ERROR:
        if (data)
-               free(data);
+               munmap(data, length);
 
        return r;
 }