libctf: add ctf_ref

This allows you to bump the refcount on a ctf_file_t, so that you can
smuggle it out of iterators which open and close the ctf_file_t for you
around the loop body (like ctf_archive_iter).

You still can't use this to preserve a ctf_file_t for longer than the
lifetime of its containing entity (e.g. ctf_archive).

include/
	* ctf-api.h (ctf_ref): New.
libctf/
	* libctf.ver (ctf_ref): New.
	* ctf-open.c (ctf_ref): Implement it.
This commit is contained in:
Nick Alcock
2020-06-08 09:24:01 +01:00
parent 9850ce4d7b
commit 2399827bfa
5 changed files with 22 additions and 0 deletions

View File

@@ -1,3 +1,7 @@
2020-07-22 Nick Alcock <nick.alcock@oracle.com>
* ctf-api.h (ctf_ref): New.
2020-07-22 Nick Alcock <nick.alcock@oracle.com> 2020-07-22 Nick Alcock <nick.alcock@oracle.com>
* ctf-api.h (ctf_archive_count): New. * ctf-api.h (ctf_archive_count): New.

View File

@@ -285,6 +285,7 @@ extern ctf_file_t *ctf_simple_open (const char *, size_t, const char *, size_t,
size_t, const char *, size_t, int *); size_t, const char *, size_t, int *);
extern ctf_file_t *ctf_bufopen (const ctf_sect_t *, const ctf_sect_t *, extern ctf_file_t *ctf_bufopen (const ctf_sect_t *, const ctf_sect_t *,
const ctf_sect_t *, int *); const ctf_sect_t *, int *);
extern void ctf_ref (ctf_file_t *);
extern void ctf_file_close (ctf_file_t *); extern void ctf_file_close (ctf_file_t *);
extern int ctf_arc_write (const char *, ctf_file_t **, size_t, extern int ctf_arc_write (const char *, ctf_file_t **, size_t,

View File

@@ -1,3 +1,8 @@
2020-07-22 Nick Alcock <nick.alcock@oracle.com>
* libctf.ver (ctf_ref): New.
* ctf-open.c (ctf_ref): Implement it.
2020-07-22 Nick Alcock <nick.alcock@oracle.com> 2020-07-22 Nick Alcock <nick.alcock@oracle.com>
* ctf-inlines.h (ctf_forwardable_kind): New. * ctf-inlines.h (ctf_forwardable_kind): New.

View File

@@ -1620,6 +1620,17 @@ bad:
return NULL; return NULL;
} }
/* Bump the refcount on the specified CTF container, to allow export of
ctf_file_t's from iterators that open and close the ctf_file_t around the
loop. (This does not extend their lifetime beyond that of the ctf_archive_t
in which they are contained.) */
void
ctf_ref (ctf_file_t *fp)
{
fp->ctf_refcnt++;
}
/* Close the specified CTF container and free associated data structures. Note /* Close the specified CTF container and free associated data structures. Note
that ctf_file_close() is a reference counted operation: if the specified file that ctf_file_close() is a reference counted operation: if the specified file
is the parent of other active containers, its reference count will be greater is the parent of other active containers, its reference count will be greater

View File

@@ -24,6 +24,7 @@ LIBCTF_1.0 {
ctf_simple_open; ctf_simple_open;
ctf_create; ctf_create;
ctf_close; ctf_close;
ctf_ref;
ctf_file_close; ctf_file_close;
ctf_cuname; ctf_cuname;