diff options
Diffstat (limited to 'libctf/ctf-string.c')
-rw-r--r-- | libctf/ctf-string.c | 76 |
1 files changed, 9 insertions, 67 deletions
diff --git a/libctf/ctf-string.c b/libctf/ctf-string.c index a16cd33..3ce2b25 100644 --- a/libctf/ctf-string.c +++ b/libctf/ctf-string.c @@ -128,7 +128,7 @@ ctf_str_create_atoms (ctf_dict_t *fp) { fp->ctf_str_atoms = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string, free, ctf_str_free_atom); - if (!fp->ctf_str_atoms) + if (fp->ctf_str_atoms == NULL) return -ENOMEM; if (!fp->ctf_prov_strtab) @@ -138,13 +138,6 @@ ctf_str_create_atoms (ctf_dict_t *fp) if (!fp->ctf_prov_strtab) goto oom_prov_strtab; - if (!fp->ctf_str_pending_ref) - fp->ctf_str_pending_ref = ctf_dynset_create (htab_hash_pointer, - htab_eq_pointer, - NULL); - if (!fp->ctf_str_pending_ref) - goto oom_str_pending_ref; - errno = 0; ctf_str_add (fp, ""); if (errno == ENOMEM) @@ -155,9 +148,6 @@ ctf_str_create_atoms (ctf_dict_t *fp) oom_str_add: ctf_dynhash_destroy (fp->ctf_prov_strtab); fp->ctf_prov_strtab = NULL; - oom_str_pending_ref: - ctf_dynset_destroy (fp->ctf_str_pending_ref); - fp->ctf_str_pending_ref = NULL; oom_prov_strtab: ctf_dynhash_destroy (fp->ctf_str_atoms); fp->ctf_str_atoms = NULL; @@ -170,13 +160,8 @@ ctf_str_free_atoms (ctf_dict_t *fp) { ctf_dynhash_destroy (fp->ctf_prov_strtab); ctf_dynhash_destroy (fp->ctf_str_atoms); - ctf_dynset_destroy (fp->ctf_str_pending_ref); } -#define CTF_STR_ADD_REF 0x1 -#define CTF_STR_MAKE_PROVISIONAL 0x2 -#define CTF_STR_PENDING_REF 0x4 - /* Add a string to the atoms table, copying the passed-in string. Return the atom added. Return NULL only when out of memory (and do not touch the passed-in string in that case). Possibly augment the ref list with the @@ -184,7 +169,7 @@ ctf_str_free_atoms (ctf_dict_t *fp) provisional strtab. */ static ctf_str_atom_t * ctf_str_add_ref_internal (ctf_dict_t *fp, const char *str, - int flags, uint32_t *ref) + int add_ref, int make_provisional, uint32_t *ref) { char *newstr = NULL; ctf_str_atom_t *atom = NULL; @@ -192,7 +177,7 @@ ctf_str_add_ref_internal (ctf_dict_t *fp, const char *str, atom = ctf_dynhash_lookup (fp->ctf_str_atoms, str); - if (flags & CTF_STR_ADD_REF) + if (add_ref) { if ((aref = malloc (sizeof (struct ctf_str_atom_ref))) == NULL) { ctf_set_errno (fp, ENOMEM); @@ -203,9 +188,8 @@ ctf_str_add_ref_internal (ctf_dict_t *fp, const char *str, if (atom) { - if (flags & CTF_STR_ADD_REF) + if (add_ref) { - ctf_dynset_remove (fp->ctf_str_pending_ref, (void *) ref); ctf_list_append (&atom->csa_refs, aref); fp->ctf_str_num_refs++; } @@ -225,7 +209,7 @@ ctf_str_add_ref_internal (ctf_dict_t *fp, const char *str, atom->csa_str = newstr; atom->csa_snapshot_id = fp->ctf_snapshots; - if (flags & CTF_STR_MAKE_PROVISIONAL) + if (make_provisional) { atom->csa_offset = fp->ctf_str_prov_offset; @@ -236,14 +220,8 @@ ctf_str_add_ref_internal (ctf_dict_t *fp, const char *str, fp->ctf_str_prov_offset += strlen (atom->csa_str) + 1; } - if (flags & CTF_STR_PENDING_REF) + if (add_ref) { - if (ctf_dynset_insert (fp->ctf_str_pending_ref, (void *) ref) < 0) - goto oom; - } - else if (flags & CTF_STR_ADD_REF) - { - ctf_dynset_remove (fp->ctf_str_pending_ref, (void *) ref); ctf_list_append (&atom->csa_refs, aref); fp->ctf_str_num_refs++; } @@ -272,7 +250,7 @@ ctf_str_add (ctf_dict_t *fp, const char *str) if (!str) str = ""; - atom = ctf_str_add_ref_internal (fp, str, CTF_STR_MAKE_PROVISIONAL, 0); + atom = ctf_str_add_ref_internal (fp, str, FALSE, TRUE, 0); if (!atom) return 0; @@ -290,47 +268,13 @@ ctf_str_add_ref (ctf_dict_t *fp, const char *str, uint32_t *ref) if (!str) str = ""; - atom = ctf_str_add_ref_internal (fp, str, CTF_STR_ADD_REF - | CTF_STR_MAKE_PROVISIONAL, ref); + atom = ctf_str_add_ref_internal (fp, str, TRUE, TRUE, ref); if (!atom) return 0; return atom->csa_offset; } -/* Like ctf_str_add_ref(), but notes that this memory location must be added as - a ref by a later serialization phase, rather than adding it itself. */ -uint32_t -ctf_str_add_pending (ctf_dict_t *fp, const char *str, uint32_t *ref) -{ - ctf_str_atom_t *atom; - - if (!str) - str = ""; - - atom = ctf_str_add_ref_internal (fp, str, CTF_STR_PENDING_REF - | CTF_STR_MAKE_PROVISIONAL, ref); - if (!atom) - return 0; - - return atom->csa_offset; -} - -/* Note that a pending ref now located at NEW_REF has moved by BYTES bytes. */ -int -ctf_str_move_pending (ctf_dict_t *fp, uint32_t *new_ref, ptrdiff_t bytes) -{ - if (bytes == 0) - return 0; - - if (ctf_dynset_insert (fp->ctf_str_pending_ref, (void *) new_ref) < 0) - return (ctf_set_errno (fp, ENOMEM)); - - ctf_dynset_remove (fp->ctf_str_pending_ref, - (void *) ((signed char *) new_ref - bytes)); - return 0; -} - /* Add an external strtab reference at OFFSET. Returns zero if the addition failed, nonzero otherwise. */ int @@ -341,7 +285,7 @@ ctf_str_add_external (ctf_dict_t *fp, const char *str, uint32_t offset) if (!str) str = ""; - atom = ctf_str_add_ref_internal (fp, str, 0, 0); + atom = ctf_str_add_ref_internal (fp, str, FALSE, FALSE, 0); if (!atom) return 0; @@ -391,8 +335,6 @@ ctf_str_remove_ref (ctf_dict_t *fp, const char *str, uint32_t *ref) free (aref); } } - - ctf_dynset_remove (fp->ctf_str_pending_ref, (void *) ref); } /* A ctf_dynhash_iter_remove() callback that removes atoms later than a given |