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>
* 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 *);
extern ctf_file_t *ctf_bufopen (const ctf_sect_t *, const ctf_sect_t *,
const ctf_sect_t *, int *);
extern void ctf_ref (ctf_file_t *);
extern void ctf_file_close (ctf_file_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>
* ctf-inlines.h (ctf_forwardable_kind): New.

View File

@ -1620,6 +1620,17 @@ bad:
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
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

View File

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