diff options
author | Michael Brown | 2014-02-25 15:03:40 +0100 |
---|---|---|
committer | Michael Brown | 2014-02-27 00:34:07 +0100 |
commit | c7b69ac793b7704c09560eb6850e4ec2bd66e575 (patch) | |
tree | 26a3a7bc1f4195ee5c39bf098bc44be43c3c5bf6 /src/core/params.c | |
parent | [settings] Remove "uristring" setting type (diff) | |
download | ipxe-c7b69ac793b7704c09560eb6850e4ec2bd66e575.tar.gz ipxe-c7b69ac793b7704c09560eb6850e4ec2bd66e575.tar.xz ipxe-c7b69ac793b7704c09560eb6850e4ec2bd66e575.zip |
[params] Use reference counters for form parameter lists
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core/params.c')
-rw-r--r-- | src/core/params.c | 68 |
1 files changed, 28 insertions, 40 deletions
diff --git a/src/core/params.c b/src/core/params.c index 21361c1f..93b83441 100644 --- a/src/core/params.c +++ b/src/core/params.c @@ -33,6 +33,29 @@ FILE_LICENCE ( GPL2_OR_LATER ); static LIST_HEAD ( parameters ); /** + * Free form parameter list + * + * @v refcnt Reference count + */ +static void free_parameters ( struct refcnt *refcnt ) { + struct parameters *params = + container_of ( refcnt, struct parameters, refcnt ); + struct parameter *param; + struct parameter *tmp; + + DBGC ( params, "PARAMS \"%s\" destroyed\n", params->name ); + + /* Free all parameters */ + list_for_each_entry_safe ( param, tmp, ¶ms->entries, list ) { + list_del ( ¶m->list ); + free ( param ); + } + + /* Free parameter list */ + free ( params ); +} + +/** * Find form parameter list by name * * @v name Parameter list name (may be NULL) @@ -63,14 +86,17 @@ struct parameters * create_parameters ( const char *name ) { /* Destroy any existing parameter list of this name */ params = find_parameters ( name ); - if ( params ) - destroy_parameters ( params ); + if ( params ) { + claim_parameters ( params ); + params_put ( params ); + } /* Allocate parameter list */ name_len = ( name ? ( strlen ( name ) + 1 /* NUL */ ) : 0 ); params = zalloc ( sizeof ( *params ) + name_len ); if ( ! params ) return NULL; + ref_init ( ¶ms->refcnt, free_parameters ); name_copy = ( ( void * ) ( params + 1 ) ); /* Populate parameter list */ @@ -125,41 +151,3 @@ struct parameter * add_parameter ( struct parameters *params, params->name, param->key, param->value ); return param; } - -/** - * Destroy form parameter list - * - * @v params Parameter list - */ -void destroy_parameters ( struct parameters *params ) { - struct parameter *param; - struct parameter *tmp; - - DBGC ( params, "PARAMS \"%s\" destroyed\n", params->name ); - - /* Free all parameters */ - list_for_each_entry_safe ( param, tmp, ¶ms->entries, list ) { - list_del ( ¶m->list ); - free ( param ); - } - - /* Free parameter list */ - list_del ( ¶ms->list ); - free ( params ); -} - -/** - * Claim ownership of form parameter list - * - * @v params Parameter list - */ -void claim_parameters ( struct parameters *params ) { - - DBGC ( params, "PARAMS \"%s\" claimed\n", params->name ); - - /* Remove from list of parameter lists */ - list_del ( ¶ms->list ); - - /* Reinitialise list to allow for subsequent destroy_parameters() */ - INIT_LIST_HEAD ( ¶ms->list ); -} |