[26/59] libctf: add ctf_ref

Message ID 20200630233146.338613-27-nick.alcock@oracle.com
State New
Headers show
Series
  • Deduplicating CTF linker
Related show

Commit Message

H.J. Lu via Binutils June 30, 2020, 11:31 p.m.
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.
---
 include/ctf-api.h |  1 +
 libctf/ctf-open.c | 11 +++++++++++
 libctf/libctf.ver |  1 +
 3 files changed, 13 insertions(+)

-- 
2.27.0.247.g3dff7de930

Patch

diff --git a/include/ctf-api.h b/include/ctf-api.h
index fb797a3346d..faa7b727fb8 100644
--- a/include/ctf-api.h
+++ b/include/ctf-api.h
@@ -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,
diff --git a/libctf/ctf-open.c b/libctf/ctf-open.c
index 05672f36498..b7846bd0014 100644
--- a/libctf/ctf-open.c
+++ b/libctf/ctf-open.c
@@ -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
diff --git a/libctf/libctf.ver b/libctf/libctf.ver
index 375dee8fc77..93616d83691 100644
--- a/libctf/libctf.ver
+++ b/libctf/libctf.ver
@@ -24,6 +24,7 @@  LIBCTF_1.0 {
 	ctf_simple_open;
 	ctf_create;
 	ctf_close;
+	ctf_ref;
 	ctf_file_close;
 
 	ctf_cuname;