chip: lazily allocate lines
authorBartosz Golaszewski <bartekgola@gmail.com>
Sat, 1 Jul 2017 12:11:40 +0000 (14:11 +0200)
committerBartosz Golaszewski <bartekgola@gmail.com>
Thu, 6 Jul 2017 09:11:36 +0000 (11:11 +0200)
Only allocate the array of line pointers is they're actually needed.

Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
src/lib/chip.c

index 093fe90dcf421fa74242c1af359035bc04b36a70..3c90b8e9eb4a91e98de04725dd4928c970f78427 100644 (file)
@@ -58,13 +58,6 @@ struct gpiod_chip * gpiod_chip_open(const char *path)
                return NULL;
        }
 
-       chip->lines = calloc(chip->cinfo.lines, sizeof(struct gpiod_line *));
-       if (!chip->lines) {
-               close(chip->fd);
-               free(chip);
-               return NULL;
-       }
-
        return chip;
 }
 
@@ -148,20 +141,23 @@ void gpiod_chip_close(struct gpiod_chip *chip)
        struct gpiod_line *line;
        unsigned int i;
 
-       for (i = 0; i < chip->cinfo.lines; i++) {
-               line = chip->lines[i];
+       if (chip->lines) {
+               for (i = 0; i < chip->cinfo.lines; i++) {
+                       line = chip->lines[i];
 
-               if (line) {
-                       gpiod_line_release(line);
-                       line_free(line);
+                       if (line) {
+                               gpiod_line_release(line);
+                               line_free(line);
+                       }
                }
+
+               free(chip->lines);
        }
 
        if (chip->chip_ctx)
                line_chip_ctx_free(chip->chip_ctx);
 
        close(chip->fd);
-       free(chip->lines);
        free(chip);
 }
 
@@ -191,6 +187,13 @@ gpiod_chip_get_line(struct gpiod_chip *chip, unsigned int offset)
                return NULL;
        }
 
+       if (!chip->lines) {
+               chip->lines = calloc(chip->cinfo.lines,
+                                    sizeof(struct gpiod_line *));
+               if (!chip->lines)
+                       return NULL;
+       }
+
        if (!chip->chip_ctx) {
                chip->chip_ctx = line_chip_ctx_new(chip, chip->fd);
                if (!chip->chip_ctx)