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;
}
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':
*cxt0 = fdisk_get_parent(cxt);
fdisk_info(cxt, _("Leaving nested disklabel."));
- fdisk_free_context(cxt);
+ fdisk_unref_context(cxt);
cxt = *cxt0;
}
break;
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,
*cxt0 = fdisk_get_parent(cxt);
fdisk_info(cxt, _("Leaving nested disklabel."));
- fdisk_free_context(cxt);
+ fdisk_unref_context(cxt);
cxt = *cxt0;
}
break;
if (fgets(buf, bufsz, stdin) && !rpmatch(buf))
continue;
}
- fdisk_free_context(cxt);
+ fdisk_unref_context(cxt);
exit(EXIT_FAILURE);
} else
break;
process_fdisk_menu(&cxt);
}
- fdisk_free_context(cxt);
+ fdisk_unref_context(cxt);
return EXIT_SUCCESS;
}
DBG(CXT, ul_debugobj(cxt, "alloc"));
cxt->dev_fd = -1;
+ cxt->refcount = 1;
/*
* Allocate label specific structs.
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;
*
* 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>
*
}
/**
- * 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);
}
/**
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);
fdisk_dump_write_file(dp, stdout);
fdisk_unref_dump(dp);
- fdisk_free_context(cxt);
+ fdisk_unref_context(cxt);
return 0;
}
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;
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);