diff options
author | Karel Zak | 2014-11-21 11:03:08 +0100 |
---|---|---|
committer | Karel Zak | 2014-11-21 11:03:08 +0100 |
commit | a3d834888e912f29def6cb1c37d1793736ce81cd (patch) | |
tree | 7e2b5022eae8e4d24d28cae5f36f38e02b68a97f /libfdisk/src | |
parent | agetty: fix typo (diff) | |
download | kernel-qcow2-util-linux-a3d834888e912f29def6cb1c37d1793736ce81cd.tar.gz kernel-qcow2-util-linux-a3d834888e912f29def6cb1c37d1793736ce81cd.tar.xz kernel-qcow2-util-linux-a3d834888e912f29def6cb1c37d1793736ce81cd.zip |
libfdisk: add ref.counting to ask API
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libfdisk/src')
-rw-r--r-- | libfdisk/src/ask.c | 67 | ||||
-rw-r--r-- | libfdisk/src/bsd.c | 4 | ||||
-rw-r--r-- | libfdisk/src/dos.c | 6 | ||||
-rw-r--r-- | libfdisk/src/fdiskP.h | 2 | ||||
-rw-r--r-- | libfdisk/src/gpt.c | 2 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.h | 3 | ||||
-rw-r--r-- | libfdisk/src/partition.c | 4 | ||||
-rw-r--r-- | libfdisk/src/sgi.c | 4 | ||||
-rw-r--r-- | libfdisk/src/sun.c | 4 |
9 files changed, 72 insertions, 24 deletions
diff --git a/libfdisk/src/ask.c b/libfdisk/src/ask.c index c6e02f348..0fc48954f 100644 --- a/libfdisk/src/ask.c +++ b/libfdisk/src/ask.c @@ -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; } diff --git a/libfdisk/src/bsd.c b/libfdisk/src/bsd.c index c92c893bb..16281e2f6 100644 --- a/libfdisk/src/bsd.c +++ b/libfdisk/src/bsd.c @@ -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)) diff --git a/libfdisk/src/dos.c b/libfdisk/src/dos.c index 54af66cf9..edf5cc2e0 100644 --- a/libfdisk/src/dos.c +++ b/libfdisk/src/dos.c @@ -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); diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h index a655ecf59..3deb64078 100644 --- a/libfdisk/src/fdiskP.h +++ b/libfdisk/src/fdiskP.h @@ -295,6 +295,8 @@ struct fdisk_ask { char *query; unsigned int flags; + int refcount; + union { /* FDISK_ASKTYPE_{NUMBER,OFFSET} */ struct ask_number { diff --git a/libfdisk/src/gpt.c b/libfdisk/src/gpt.c index d3bc4ae00..12756997a 100644 --- a/libfdisk/src/gpt.c +++ b/libfdisk/src/gpt.c @@ -2146,7 +2146,7 @@ static int gpt_add_partition( if (partno) *partno = partnum; done: - fdisk_free_ask(ask); + fdisk_unref_ask(ask); return rc; } diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h index 359bd4acb..3ca1f7aea 100644 --- a/libfdisk/src/libfdisk.h +++ b/libfdisk/src/libfdisk.h @@ -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); diff --git a/libfdisk/src/partition.c b/libfdisk/src/partition.c index 1af3cf245..194b68e3d 100644 --- a/libfdisk/src/partition.c +++ b/libfdisk/src/partition.c @@ -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) diff --git a/libfdisk/src/sgi.c b/libfdisk/src/sgi.c index e2eff9bb4..c99deb3c7 100644 --- a/libfdisk/src/sgi.c +++ b/libfdisk/src/sgi.c @@ -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)) diff --git a/libfdisk/src/sun.c b/libfdisk/src/sun.c index dcde5d7af..82dd2c326 100644 --- a/libfdisk/src/sun.c +++ b/libfdisk/src/sun.c @@ -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)) |