]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[params] Use reference counters for form parameter lists
authorMichael Brown <mcb30@ipxe.org>
Tue, 25 Feb 2014 14:03:40 +0000 (14:03 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 26 Feb 2014 23:34:07 +0000 (23:34 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/params.c
src/core/uri.c
src/hci/commands/param_cmd.c
src/include/ipxe/params.h

index 21361c1f8ee98aea379b4dfa0bf9563bbdd58fd5..93b834419704e49f960b1bffdde6e24fdb5f0b8e 100644 (file)
@@ -32,6 +32,29 @@ FILE_LICENCE ( GPL2_OR_LATER );
 /** List of all parameter lists */
 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, &params->entries, list ) {
+               list_del ( &param->list );
+               free ( param );
+       }
+
+       /* Free parameter list */
+       free ( params );
+}
+
 /**
  * Find form parameter list by name
  *
@@ -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 ( &params->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, &params->entries, list ) {
-               list_del ( &param->list );
-               free ( param );
-       }
-
-       /* Free parameter list */
-       list_del ( &params->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 ( &params->list );
-
-       /* Reinitialise list to allow for subsequent destroy_parameters() */
-       INIT_LIST_HEAD ( &params->list );
-}
index bc55e4d8c68beaedb25d01f959ab3b6ea0d00949..499fb9750bf78eaf4b380e4da5265b30da053c88 100644 (file)
@@ -72,8 +72,7 @@ static void dump_uri ( struct uri *uri ) {
 static void free_uri ( struct refcnt *refcnt ) {
        struct uri *uri = container_of ( refcnt, struct uri, refcnt );
 
-       if ( uri->params )
-               destroy_parameters ( uri->params );
+       params_put ( uri->params );
        free ( uri );
 }
 
@@ -89,6 +88,7 @@ static void free_uri ( struct refcnt *refcnt ) {
  */
 struct uri * parse_uri ( const char *uri_string ) {
        struct uri *uri;
+       struct parameters *params;
        char *raw;
        char *tmp;
        char *path;
@@ -111,9 +111,9 @@ struct uri * parse_uri ( const char *uri_string ) {
        if ( ( tmp = strstr ( raw, "##params" ) ) ) {
                *tmp = '\0';
                tmp += 8 /* "##params" */;
-               uri->params = find_parameters ( *tmp ? ( tmp + 1 ) : NULL );
-               if ( uri->params ) {
-                       claim_parameters ( uri->params );
+               params = find_parameters ( *tmp ? ( tmp + 1 ) : NULL );
+               if ( params ) {
+                       uri->params = claim_parameters ( params );
                } else {
                        /* Ignore non-existent submission blocks */
                }
index a30c62af9bf7b232675dfbbc3fb5754ce567b583..6cf096d00833b91a06b532eda5e14be69e38ea71 100644 (file)
@@ -74,8 +74,10 @@ static int params_exec ( int argc, char **argv ) {
                return -ENOMEM;
 
        /* Destroy parameter list, if applicable */
-       if ( opts.delete )
-               destroy_parameters ( params );
+       if ( opts.delete ) {
+               claim_parameters ( params );
+               params_put ( params );
+       }
 
        return 0;
 }
index d78adf562ece9402f41f2aee659b9158a864cb7f..c2d82d9cfbfbc9bf6d3fe9366b9071099910bc56 100644 (file)
@@ -14,6 +14,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
 
 /** A form parameter list */
 struct parameters {
+       /** Reference count */
+       struct refcnt refcnt;
        /** List of all parameter lists */
        struct list_head list;
        /** Name */
@@ -32,6 +34,43 @@ struct parameter {
        const char *value;
 };
 
+/**
+ * Increment form parameter list reference count
+ *
+ * @v params           Parameter list, or NULL
+ * @ret params         Parameter list as passed in
+ */
+static inline __attribute__ (( always_inline )) struct parameters *
+params_get ( struct parameters *params ) {
+       ref_get ( &params->refcnt );
+       return params;
+}
+
+/**
+ * Decrement form parameter list reference count
+ *
+ * @v params           Parameter list, or NULL
+ */
+static inline __attribute__ (( always_inline )) void
+params_put ( struct parameters *params ) {
+       ref_put ( &params->refcnt );
+}
+
+/**
+ * Claim ownership of form parameter list
+ *
+ * @v params           Parameter list
+ * @ret params         Parameter list
+ */
+static inline __attribute__ (( always_inline )) struct parameters *
+claim_parameters ( struct parameters *params ) {
+
+       /* Remove from list of parameter lists */
+       list_del ( &params->list );
+
+       return params;
+}
+
 /** Iterate over all form parameters in a list */
 #define for_each_param( param, params )                                \
        list_for_each_entry ( (param), &(params)->entries, list )
@@ -40,7 +79,5 @@ extern struct parameters * find_parameters ( const char *name );
 extern struct parameters * create_parameters ( const char *name );
 extern struct parameter * add_parameter ( struct parameters *params,
                                          const char *key, const char *value );
-extern void destroy_parameters ( struct parameters *params );
-extern void claim_parameters ( struct parameters *params );
 
 #endif /* _IPXE_PARAMS_H */