diff options
| author | Michael Brown | 2007-05-28 19:35:15 +0200 |
|---|---|---|
| committer | Michael Brown | 2007-05-28 19:35:15 +0200 |
| commit | 656485c1f1487775ccb0c223c4f5809f8daa7fcc (patch) | |
| tree | 045b8b6e395af9b8906ce30ed6c707f0d2310db1 /src/include/gpxe | |
| parent | Move increment/decrement debug messages to DBG2 level (diff) | |
| download | ipxe-656485c1f1487775ccb0c223c4f5809f8daa7fcc.tar.gz ipxe-656485c1f1487775ccb0c223c4f5809f8daa7fcc.tar.xz ipxe-656485c1f1487775ccb0c223c4f5809f8daa7fcc.zip | |
Make URI structures reference-counted.
Diffstat (limited to 'src/include/gpxe')
| -rw-r--r-- | src/include/gpxe/open.h | 3 | ||||
| -rw-r--r-- | src/include/gpxe/uri.h | 23 |
2 files changed, 18 insertions, 8 deletions
diff --git a/src/include/gpxe/open.h b/src/include/gpxe/open.h index b16bbe88a..5e368486b 100644 --- a/src/include/gpxe/open.h +++ b/src/include/gpxe/open.h @@ -46,9 +46,6 @@ struct uri_opener { * @v xfer Data transfer interface * @v uri URI * @ret rc Return status code - * - * This method takes ownership of the URI structure, and is - * responsible for eventually calling free_uri(). */ int ( * open ) ( struct xfer_interface *xfer, struct uri *uri ); }; diff --git a/src/include/gpxe/uri.h b/src/include/gpxe/uri.h index b8c7e098a..6fddcc33b 100644 --- a/src/include/gpxe/uri.h +++ b/src/include/gpxe/uri.h @@ -8,6 +8,7 @@ */ #include <stdlib.h> +#include <gpxe/refcnt.h> /** A Uniform Resource Identifier * @@ -37,6 +38,8 @@ * query = "what=is", fragment = "this" */ struct uri { + /** Reference count */ + struct refcnt refcnt; /** Scheme */ const char *scheme; /** Opaque part */ @@ -100,15 +103,25 @@ static inline int uri_has_relative_path ( struct uri *uri ) { } /** - * Free URI structure + * Increment URI reference count * * @v uri URI + * @ret uri URI + */ +static inline __attribute__ (( always_inline )) struct uri * +uri_get ( struct uri *uri ) { + ref_get ( &uri->refcnt ); + return uri; +} + +/** + * Decrement URI reference count * - * Frees all the dynamically-allocated storage used by the URI - * structure. + * @v uri URI */ -static inline void free_uri ( struct uri *uri ) { - free ( uri ); +static inline __attribute__ (( always_inline )) void +uri_put ( struct uri *uri ) { + ref_put ( &uri->refcnt ); } extern struct uri * parse_uri ( const char *uri_string ); |
