]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: add ref.counting to ask API
authorKarel Zak <kzak@redhat.com>
Fri, 21 Nov 2014 10:03:08 +0000 (11:03 +0100)
committerKarel Zak <kzak@redhat.com>
Fri, 21 Nov 2014 10:03:08 +0000 (11:03 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
libfdisk/src/ask.c
libfdisk/src/bsd.c
libfdisk/src/dos.c
libfdisk/src/fdiskP.h
libfdisk/src/gpt.c
libfdisk/src/libfdisk.h
libfdisk/src/partition.c
libfdisk/src/sgi.c
libfdisk/src/sun.c

index c6e02f348c405fabf2afa2502ffff88b5a9bb1c3..0fc48954fea3121bfbfaf26ec8369a63eca88f3e 100644 (file)
@@ -1,38 +1,83 @@
 
 #include "strutils.h"
-
 #include "fdiskP.h"
 
-static void fdisk_ask_menu_reset_items(struct fdisk_ask *ask);
+/**
+ * SECTION: ask
+ * @title: Ask callback
+ * @short_description: interface for dialog driven partitioning
+ *
+ */
 
+static void fdisk_ask_menu_reset_items(struct fdisk_ask *ask);
 
+/**
+ * fdisk_new_ask:
+ *
+ * Returns: newly allocated ask instance.
+ */
 struct fdisk_ask *fdisk_new_ask(void)
 {
        struct fdisk_ask *ask = calloc(1, sizeof(struct fdisk_ask));
        DBG(ASK, ul_debugobj(ask, "alloc"));
+       ask->refcount = 1;
        return ask;
 }
 
+/**
+ * fdisk_reset_ask:
+ * @ask: ask instance
+ *
+ * Resets all ask setting.
+ */
 void fdisk_reset_ask(struct fdisk_ask *ask)
 {
+       int refcount;
+
        assert(ask);
        free(ask->query);
 
        DBG(ASK, ul_debugobj(ask, "reset"));
+       refcount = ask->refcount;
 
        if (fdisk_is_ask(ask, MENU))
                fdisk_ask_menu_reset_items(ask);
 
        memset(ask, 0, sizeof(*ask));
+       ask->refcount = refcount;
 }
 
-void fdisk_free_ask(struct fdisk_ask *ask)
+/**
+ * fdisk_ref_ask:
+ * @ask: ask instance
+ *
+ * Incremparts reference counter.
+ */
+void fdisk_ref_ask(struct fdisk_ask *ask)
+{
+       if (ask)
+               ask->refcount++;
+}
+
+
+/**
+ * fdisk_unref_ask:
+ * @ask: ask instance
+ *
+ * De-incremparts reference counter, on zero the @ask is automatically
+ * deallocated.
+ */
+void fdisk_unref_ask(struct fdisk_ask *ask)
 {
        if (!ask)
                return;
-       fdisk_reset_ask(ask);
-       DBG(ASK, ul_debugobj(ask, "free"));
-       free(ask);
+       ask->refcount--;
+
+       if (ask->refcount <= 0) {
+               fdisk_reset_ask(ask);
+               DBG(ASK, ul_debugobj(ask, "free"));
+               free(ask);
+       }
 }
 
 const char *fdisk_ask_get_query(struct fdisk_ask *ask)
@@ -384,7 +429,7 @@ dont_ask:
                        *partnum -= 1;
        }
        DBG(ASK, ul_debugobj(ask, "result: %ju [rc=%d]\n", fdisk_ask_number_get_result(ask), rc));
-       fdisk_free_ask(ask);
+       fdisk_unref_ask(ask);
        return rc;
 }
 
@@ -420,7 +465,7 @@ int fdisk_ask_number(struct fdisk_context *cxt,
                *result = fdisk_ask_number_get_result(ask);
 
        DBG(ASK, ul_debugobj(ask, "result: %ju [rc=%d]\n", *result, rc));
-       fdisk_free_ask(ask);
+       fdisk_unref_ask(ask);
        return rc;
 }
 
@@ -466,7 +511,7 @@ int fdisk_ask_string(struct fdisk_context *cxt,
                *result = fdisk_ask_string_get_result(ask);
 
        DBG(ASK, ul_debugobj(ask, "result: %s [rc=%d]\n", *result, rc));
-       fdisk_free_ask(ask);
+       fdisk_unref_ask(ask);
        return rc;
 }
 
@@ -492,7 +537,7 @@ int fdisk_ask_yesno(struct fdisk_context *cxt,
                *result = fdisk_ask_yesno_get_result(ask) == 1 ? 1 : 0;
 
        DBG(ASK, ul_debugobj(ask, "result: %d [rc=%d]\n", *result, rc));
-       fdisk_free_ask(ask);
+       fdisk_unref_ask(ask);
        return rc;
 }
 
@@ -690,7 +735,7 @@ static int do_vprint(struct fdisk_context *cxt, int errnum, int type,
                fdisk_ask_print_set_errno(ask, errnum);
        rc = fdisk_do_ask(cxt, ask);
 
-       fdisk_free_ask(ask);
+       fdisk_unref_ask(ask);
        free(mesg);
        return rc;
 }
index c92c893bbbf259e7e7dedb0056b88ed88ef5ad95..16281e2f6e30a71703bbfcd1a9699b118f9c4502 100644 (file)
@@ -257,7 +257,7 @@ static int bsd_add_partition(struct fdisk_context *cxt,
 
                rc = fdisk_do_ask(cxt, ask);
                begin = fdisk_ask_number_get_result(ask);
-               fdisk_free_ask(ask);
+               fdisk_unref_ask(ask);
                if (rc)
                        return rc;
                if (fdisk_use_cylinders(cxt))
@@ -298,7 +298,7 @@ static int bsd_add_partition(struct fdisk_context *cxt,
 
                rc = fdisk_do_ask(cxt, ask);
                end = fdisk_ask_number_get_result(ask);
-               fdisk_free_ask(ask);
+               fdisk_unref_ask(ask);
                if (rc)
                        return rc;
                if (fdisk_use_cylinders(cxt))
index 54af66cf91f94c056a57b7872828bb17c4d1eea8..edf5cc2e093cf843a7100ace95ae070e1ac04d68 100644 (file)
@@ -934,7 +934,7 @@ static int get_start_from_user(     struct fdisk_context *cxt,
 
                rc = fdisk_do_ask(cxt, ask);
                *start = fdisk_ask_number_get_result(ask);
-               fdisk_free_ask(ask);
+               fdisk_unref_ask(ask);
                if (rc)
                        return rc;
                if (fdisk_use_cylinders(cxt)) {
@@ -1167,7 +1167,7 @@ static int add_partition(struct fdisk_context *cxt, size_t n,
                rc = fdisk_do_ask(cxt, ask);
                stop = fdisk_ask_number_get_result(ask);
                isrel = fdisk_ask_number_is_relative(ask);
-               fdisk_free_ask(ask);
+               fdisk_unref_ask(ask);
                if (rc)
                        return rc;
                if (fdisk_use_cylinders(cxt)) {
@@ -1612,7 +1612,7 @@ static int dos_add_partition(struct fdisk_context *cxt,
                if (rc)
                        return rc;
                fdisk_ask_menu_get_result(ask, &c);
-               fdisk_free_ask(ask);
+               fdisk_unref_ask(ask);
 
                if (c == 'p') {
                        rc = get_partition_unused_primary(cxt, pa, &res);
index a655ecf5956d7d03c26b4594179c8f3d47e7dda5..3deb64078e03e0857f1ff2e99a8c83481c4fcfb2 100644 (file)
@@ -295,6 +295,8 @@ struct fdisk_ask {
        char            *query;
        unsigned int    flags;
 
+       int             refcount;
+
        union {
                /* FDISK_ASKTYPE_{NUMBER,OFFSET} */
                struct ask_number {
index d3bc4ae00ef6b8d9124f42e2875abf29733cf673..12756997a96b8b7ada402ebad29e088abb58efb4 100644 (file)
@@ -2146,7 +2146,7 @@ static int gpt_add_partition(
        if (partno)
                *partno = partnum;
 done:
-       fdisk_free_ask(ask);
+       fdisk_unref_ask(ask);
        return rc;
 }
 
index 359bd4acbfa70a6cf5aa6203e6bd4d48511b5b68..3ca1f7aead92fff3d5ee0b11a1c798be3f8b9bfd 100644 (file)
@@ -455,7 +455,8 @@ int fdisk_apply_script(struct fdisk_context *cxt, struct fdisk_script *dp);
 
 extern struct fdisk_ask *fdisk_new_ask(void);
 extern void fdisk_reset_ask(struct fdisk_ask *ask);
-extern void fdisk_free_ask(struct fdisk_ask *ask);
+extern void fdisk_ref_ask(struct fdisk_ask *ask);
+extern void fdisk_unref_ask(struct fdisk_ask *ask);
 extern const char *fdisk_ask_get_query(struct fdisk_ask *ask);
 extern int fdisk_ask_set_query(struct fdisk_ask *ask, const char *str);
 extern int fdisk_ask_get_type(struct fdisk_ask *ask);
index 1af3cf245aa578d612d2ca114f2f933577a4c728..194b68e3d06fd717d8224688b48fe929e0c3623b 100644 (file)
@@ -85,9 +85,9 @@ void fdisk_ref_partition(struct fdisk_partition *pa)
 
 /**
  * fdisk_unref_partition:
- * @tb: partition pointer
+ * @pa: partition pointer
  *
- * De-incremparts reference counter, on zero the @tb is automatically
+ * De-incremparts reference counter, on zero the @pa is automatically
  * deallocated.
  */
 void fdisk_unref_partition(struct fdisk_partition *pa)
index e2eff9bb4739aad5be7e38b070808aa3312f9f6b..c99deb3c796d84abb5438cc854824cee0f4b28d3 100644 (file)
@@ -838,7 +838,7 @@ static int sgi_add_partition(struct fdisk_context *cxt,
 
                rc = fdisk_do_ask(cxt, ask);
                first = fdisk_ask_number_get_result(ask);
-               fdisk_free_ask(ask);
+               fdisk_unref_ask(ask);
 
                if (rc)
                        return rc;
@@ -888,7 +888,7 @@ static int sgi_add_partition(struct fdisk_context *cxt,
                rc = fdisk_do_ask(cxt, ask);
                last = fdisk_ask_number_get_result(ask) + 1;
 
-               fdisk_free_ask(ask);
+               fdisk_unref_ask(ask);
                if (rc)
                        return rc;
                if (fdisk_use_cylinders(cxt))
index dcde5d7afa2f5a3af2fe244dc13336010fdd665c..82dd2c326b54dc25d7ca6cefe8eee5ab7288043b 100644 (file)
@@ -550,7 +550,7 @@ static int sun_add_partition(
                        }
                        rc = fdisk_do_ask(cxt, ask);
                        first = fdisk_ask_number_get_result(ask);
-                       fdisk_free_ask(ask);
+                       fdisk_unref_ask(ask);
                        if (rc)
                                return rc;
 
@@ -657,7 +657,7 @@ static int sun_add_partition(
                rc = fdisk_do_ask(cxt, ask);
                last = fdisk_ask_number_get_result(ask);
 
-               fdisk_free_ask(ask);
+               fdisk_unref_ask(ask);
                if (rc)
                        return rc;
                if (fdisk_use_cylinders(cxt))