]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: use reference counting for context
authorKarel Zak <kzak@redhat.com>
Thu, 28 Aug 2014 10:49:16 +0000 (12:49 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 28 Aug 2014 10:49:16 +0000 (12:49 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
disk-utils/cfdisk.c
disk-utils/fdisk-menu.c
disk-utils/fdisk.c
libfdisk/src/context.c
libfdisk/src/dump.c
libfdisk/src/fdiskP.h
libfdisk/src/libfdisk.h

index c259329c139a3c838292a0cf32e197139f9f199d..ef4e3ffb917987d80addb6317b52b6906c486802 100644 (file)
@@ -2100,7 +2100,7 @@ int main(int argc, char *argv[])
        fdisk_unref_table(cf->table);
 
        rc = fdisk_deassign_device(cf->cxt, cf->nwrites == 0);
-       fdisk_free_context(cf->cxt);
+       fdisk_unref_context(cf->cxt);
        DBG(MISC, ul_debug("bye! [rc=%d]", rc));
        return rc == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
index c511b626e366f458aac07b93aba4b4cfddfb6a4d..efd8dc1c60cdd9e64f05f75a815d406cd42348ef 100644 (file)
@@ -475,7 +475,7 @@ static int generic_menu_cb(struct fdisk_context **cxt0,
                        rc = fdisk_deassign_device(cxt, 0);
                /* fallthrough */
        case 'q':
-               fdisk_free_context(cxt);
+               fdisk_unref_context(cxt);
                fputc('\n', stdout);
                exit(rc == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
        case 'm':
@@ -543,7 +543,7 @@ static int generic_menu_cb(struct fdisk_context **cxt0,
                        *cxt0 = fdisk_get_parent(cxt);
 
                        fdisk_info(cxt, _("Leaving nested disklabel."));
-                       fdisk_free_context(cxt);
+                       fdisk_unref_context(cxt);
                        cxt = *cxt0;
                }
                break;
@@ -649,7 +649,7 @@ static int dos_menu_cb(struct fdisk_context **cxt0,
                        if (!fdisk_has_label(bsd))
                                rc = fdisk_create_disklabel(bsd, "bsd");
                        if (rc)
-                               fdisk_free_context(bsd);
+                               fdisk_unref_context(bsd);
                        else {
                                *cxt0 = cxt = bsd;
                                fdisk_sinfo(cxt, FDISK_INFO_SUCCESS,
@@ -683,7 +683,7 @@ static int dos_menu_cb(struct fdisk_context **cxt0,
                        *cxt0 = fdisk_get_parent(cxt);
 
                        fdisk_info(cxt, _("Leaving nested disklabel."));
-                       fdisk_free_context(cxt);
+                       fdisk_unref_context(cxt);
                        cxt = *cxt0;
                }
                break;
index 4f9d69454de8ee8eeaf986fd07e950485504fff9..c61e263995fd28e2623052287974eb4a3b56875f 100644 (file)
@@ -74,7 +74,7 @@ int get_user_reply(struct fdisk_context *cxt, const char *prompt,
                                if (fgets(buf, bufsz, stdin) && !rpmatch(buf))
                                        continue;
                        }
-                       fdisk_free_context(cxt);
+                       fdisk_unref_context(cxt);
                        exit(EXIT_FAILURE);
                } else
                        break;
@@ -1064,6 +1064,6 @@ int main(int argc, char **argv)
                        process_fdisk_menu(&cxt);
        }
 
-       fdisk_free_context(cxt);
+       fdisk_unref_context(cxt);
        return EXIT_SUCCESS;
 }
index 4232448175c4e09d110f99c31c7fb38db192cf0a..caeec231b7c48e2e5a3ccb49c193e366d49ae7e4 100644 (file)
@@ -46,6 +46,7 @@ struct fdisk_context *fdisk_new_context(void)
 
        DBG(CXT, ul_debugobj(cxt, "alloc"));
        cxt->dev_fd = -1;
+       cxt->refcount = 1;
 
        /*
         * Allocate label specific structs.
@@ -85,6 +86,7 @@ struct fdisk_context *fdisk_new_nested_context(struct fdisk_context *parent,
 
        DBG(CXT, ul_debugobj(parent, "alloc nested [%p]", cxt));
        cxt->dev_fd = parent->dev_fd;
+       cxt->refcount = 1;
        cxt->parent = parent;
 
        cxt->io_size =          parent->io_size;
@@ -169,7 +171,7 @@ struct fdisk_label *fdisk_get_label(struct fdisk_context *cxt, const char *name)
  *
  *     while (fdisk_next_label(cxt, &lb) == 0)
  *             print("label name: %s\n", fdisk_label_get_name(lb));
- *     fdisk_free_context(cxt);
+ *     fdisk_unref_context(cxt);
  *   </programlisting>
  * </informalexample>
  *
@@ -459,32 +461,34 @@ int fdisk_is_readonly(struct fdisk_context *cxt)
 }
 
 /**
- * fdisk_free_context:
+ * fdisk_unref_context:
  * @cxt: fdisk context
  *
  * Deallocates context struct.
  */
-void fdisk_free_context(struct fdisk_context *cxt)
+void fdisk_unref_context(struct fdisk_context *cxt)
 {
        int i;
 
        if (!cxt)
                return;
 
-       DBG(CXT, ul_debugobj(cxt, "freeing context %p for %s", cxt, cxt->dev_path));
-       reset_context(cxt);
-
-       /* deallocate label's private stuff */
-       for (i = 0; i < cxt->nlabels; i++) {
-               if (!cxt->labels[i])
-                       continue;
-               if (cxt->labels[i]->op->free)
-                       cxt->labels[i]->op->free(cxt->labels[i]);
-               else
-                       free(cxt->labels[i]);
+       cxt->refcount--;
+       if (cxt->refcount <= 0) {
+               DBG(CXT, ul_debugobj(cxt, "freeing context %p for %s", cxt, cxt->dev_path));
+               reset_context(cxt);
+
+               /* deallocate label's private stuff */
+               for (i = 0; i < cxt->nlabels; i++) {
+                       if (!cxt->labels[i])
+                               continue;
+                       if (cxt->labels[i]->op->free)
+                               cxt->labels[i]->op->free(cxt->labels[i]);
+                       else
+                               free(cxt->labels[i]);
+               }
+               free(cxt);
        }
-
-       free(cxt);
 }
 
 /**
index 561d9c140c0caae98897a6459978731e2be7d8c7..d9e1fd12d43c6afae63388e9d446fd73ec9b1855 100644 (file)
@@ -714,7 +714,7 @@ int test_dump(struct fdisk_test *ts, int argc, char *argv[])
        fdisk_dump_read_context(dp, cxt);
        fdisk_dump_set_header(dp, "custom-header-foo", "bar");
 
-       fdisk_free_context(cxt);
+       fdisk_unref_context(cxt);
 
        fdisk_dump_write_file(dp, stdout);
        fdisk_unref_dump(dp);
@@ -740,7 +740,7 @@ int test_read(struct fdisk_test *ts, int argc, char *argv[])
 
        fdisk_dump_write_file(dp, stdout);
        fdisk_unref_dump(dp);
-       fdisk_free_context(cxt);
+       fdisk_unref_context(cxt);
 
        return 0;
 }
index 69f26474516d0dd38c2a9ace122b407e4f9fca88..54e1d1039f96c86cfd65566b057613ad38ddb8c5 100644 (file)
@@ -334,6 +334,7 @@ struct fdisk_ask {
 struct fdisk_context {
        int dev_fd;         /* device descriptor */
        char *dev_path;     /* device path */
+       int refcount;
 
        unsigned char *firstsector; /* buffer with master boot record */
        unsigned long firstsector_bufsz;
index 73ac7cb77086d8b8b5d466051da5df18037d1d94..19aef58d7db1988fe0e242b9223c83995e90faef 100644 (file)
@@ -78,7 +78,7 @@ extern void fdisk_init_debug(int mask);
 
 struct fdisk_context *fdisk_new_context(void);
 struct fdisk_context *fdisk_new_nested_context(struct fdisk_context *parent, const char *name);
-void fdisk_free_context(struct fdisk_context *cxt);
+void fdisk_unref_context(struct fdisk_context *cxt);
 
 struct fdisk_context *fdisk_get_parent(struct fdisk_context *cxt);