diff options
author | Joshua Haberman <joshua@reverberate.org> | 2009-08-15 22:10:07 -0700 |
---|---|---|
committer | Joshua Haberman <joshua@reverberate.org> | 2009-08-15 22:10:07 -0700 |
commit | 1e82f0ebd6ae0de251ec6c3cac0544d96d973f1b (patch) | |
tree | 0333d9ff6b32e7ff5c66fc20ec5dba912ab7d772 /src/upb_context.h | |
parent | 7fa19a3f958c9a2ed7387cb373f0aa7bba707922 (diff) |
A few more thread-safety fixes.
Diffstat (limited to 'src/upb_context.h')
-rw-r--r-- | src/upb_context.h | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/src/upb_context.h b/src/upb_context.h index 504b1b6..8e46cae 100644 --- a/src/upb_context.h +++ b/src/upb_context.h @@ -53,7 +53,7 @@ struct upb_context { /* Initializes a upb_context. Contexts are not freed explicitly, but unref'd * when the caller is done with them. */ -struct upb_context *upb_context_new(); +struct upb_context *upb_context_new(void); INLINE void upb_context_ref(struct upb_context *c) { upb_atomic_ref(&c->refcount); } @@ -70,23 +70,24 @@ void upb_context_unref(struct upb_context *c); * root namespace). * * Returns NULL if the symbol has not been defined. */ -struct upb_symtab_entry *upb_context_resolve(struct upb_context *c, - struct upb_string *base, - struct upb_string *symbol); +bool upb_context_resolve(struct upb_context *c, struct upb_string *base, + struct upb_string *symbol, + struct upb_symtab_entry *out_entry); /* Find an entry in the symbol table with this exact name. Returns NULL if no * such symbol name exists. */ -struct upb_symtab_entry *upb_context_lookup(struct upb_context *c, - struct upb_string *symbol); +bool upb_context_lookup(struct upb_context *c, struct upb_string *symbol, + struct upb_symtab_entry *out_entry); -INLINE struct upb_symtab_entry *upb_context_symbegin(struct upb_context *c) { - return (struct upb_symtab_entry*)upb_strtable_begin(&c->symtab); -} - -INLINE struct upb_symtab_entry *upb_context_symnext( - struct upb_context *c, struct upb_symtab_entry *cur) { - return (struct upb_symtab_entry*)upb_strtable_next(&c->symtab, &cur->e); -} +/* For enumerating over the entries in the symbol table. The enumerator + * callback will be called once for every symtab entry. + * + * The callback *must not* block or take any significant amount of time, since + * the upb_context's lock is held while it is being called! */ +typedef void (*upb_context_enumerator_t)( + void *udata, struct upb_symtab_entry *entry); +void upb_context_enumerate(struct upb_context *c, upb_context_enumerator_t, + void *udata); /* Adding symbols. ************************************************************/ |