You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2022/07/06 12:13:03 UTC

[qpid-proton] branch main updated (c33f1abc1 -> 0c240d12a)

This is an automated email from the ASF dual-hosted git repository.

astitcher pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git


    from c33f1abc1 PROTON-2535: TLS OpenSSL library: remove BIO on decrypt side for accurate errors and byte counts
     new 730bdaab7 PROTON-2562: Use fixed buffer for logging raw byte output
     new 5ebd13fe8 PROTON-2559: making object.h mostly private
     new 0836fabc3 PROTON-2559: Modify pn_object inspect operation to use pn_fixed_string_t
     new 0c240d12a PROTON-2562: Finish using fixed size buffers for logging output

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 c/include/proton/object.h                          | 220 +++------------------
 c/include/proton/reactor.h                         |   3 +-
 c/src/core/buffer.h                                |   6 +-
 c/src/core/codec.c                                 | 181 +++++++++--------
 c/src/core/data.h                                  |   3 +-
 c/src/core/engine.c                                |  18 +-
 c/src/core/event.c                                 |  42 ++--
 c/src/core/fixed_string.h                          |   3 +
 c/src/core/logger.c                                |  47 +++--
 c/src/core/logger_private.h                        |   1 -
 c/src/core/memory.h                                |   2 +-
 c/src/core/message.c                               | 167 ++++++----------
 c/src/core/object/list.c                           |  17 +-
 c/src/core/object/map.c                            |  23 +--
 c/src/core/object/object.c                         |  60 ++++--
 c/src/core/object/string.c                         |  18 +-
 .../proton/object.h => src/core/object_private.h}  | 156 +++++----------
 c/src/core/util.h                                  |   8 +-
 c/src/extra/url.c                                  |  11 +-
 c/src/handlers/handshaker.c                        |   6 +-
 c/src/handlers/iohandler.c                         |   7 +-
 c/src/messenger/subscription.c                     |   6 +-
 c/src/messenger/subscription.h                     |   2 +
 c/src/reactor/acceptor.c                           |   2 +
 c/src/reactor/connection.c                         |  10 +-
 c/src/reactor/handler.c                            |   4 +-
 c/src/reactor/io/posix/io.c                        |   5 +-
 c/src/reactor/io/windows/iocp.h                    |   3 +-
 c/src/reactor/reactor.c                            |  12 +-
 c/src/reactor/selectable.c                         |   2 +-
 c/src/reactor/selectable.h                         |   2 +
 c/src/reactor/timer.c                              |   4 +-
 c/tests/event_test.cpp                             |   5 +-
 c/tests/object_test.cpp                            |   5 +-
 c/tools/reactor-recv.c                             |   1 +
 python/cproton.i                                   |   2 +-
 ruby/cproton.i                                     |   1 +
 37 files changed, 436 insertions(+), 629 deletions(-)
 copy c/{include/proton/object.h => src/core/object_private.h} (63%)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[qpid-proton] 02/04: PROTON-2559: making object.h mostly private

Posted by as...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

astitcher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git

commit 5ebd13fe8b29566eac7fdc07e824c87262b3a443
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Wed Apr 13 14:39:53 2022 -0400

    PROTON-2559: making object.h mostly private
---
 c/include/proton/object.h                          | 220 +++------------------
 c/include/proton/reactor.h                         |   3 +-
 c/src/core/buffer.h                                |   3 +-
 c/src/core/event.c                                 |   7 +-
 c/src/core/memory.h                                |   2 +-
 c/src/core/object/object.c                         |   6 +-
 .../proton/object.h => src/core/object_private.h}  | 152 +++++---------
 c/src/core/value_dump.h                            |   2 +
 c/src/handlers/handshaker.c                        |   6 +-
 c/src/handlers/iohandler.c                         |   7 +-
 c/src/messenger/subscription.c                     |   6 +-
 c/src/messenger/subscription.h                     |   2 +
 c/src/reactor/acceptor.c                           |   2 +
 c/src/reactor/connection.c                         |  10 +-
 c/src/reactor/handler.c                            |   4 +-
 c/src/reactor/io/posix/io.c                        |   5 +-
 c/src/reactor/io/windows/iocp.h                    |   3 +-
 c/src/reactor/reactor.c                            |   2 +-
 c/src/reactor/selectable.c                         |   2 +-
 c/src/reactor/selectable.h                         |   2 +
 c/src/reactor/timer.c                              |   4 +-
 c/tests/event_test.cpp                             |   5 +-
 c/tests/object_test.cpp                            |   5 +-
 c/tools/reactor-recv.c                             |   1 +
 python/cproton.i                                   |   2 +-
 ruby/cproton.i                                     |   1 +
 26 files changed, 135 insertions(+), 329 deletions(-)

diff --git a/c/include/proton/object.h b/c/include/proton/object.h
index 771c692c3..a97d01f16 100644
--- a/c/include/proton/object.h
+++ b/c/include/proton/object.h
@@ -24,9 +24,6 @@
 
 #include <proton/cid.h>
 #include <proton/types.h>
-#include <stdarg.h>
-#include <proton/type_compat.h>
-#include <stddef.h>
 #include <proton/import_export.h>
 
 #ifdef __cplusplus
@@ -36,72 +33,6 @@ extern "C" {
 /**
  * @cond INTERNAL
  */
-
-typedef intptr_t pn_shandle_t;
-
-typedef struct pn_string_t pn_string_t;
-typedef struct pn_list_t pn_list_t;
-typedef struct pn_map_t pn_map_t;
-typedef struct pn_hash_t pn_hash_t;
-typedef void *(*pn_iterator_next_t)(void *state);
-typedef struct pn_iterator_t pn_iterator_t;
-
-struct pn_class_t {
-  const char *name;
-  pn_cid_t cid;
-  void *(*newinst)(const pn_class_t *, size_t);
-  void (*initialize)(void *);
-  void (*incref)(void *);
-  void (*decref)(void *);
-  int (*refcount)(void *);
-  void (*finalize)(void *);
-  void (*free)(void *);
-  uintptr_t (*hashcode)(void *);
-  intptr_t (*compare)(void *, void *);
-  int (*inspect)(void *, pn_string_t *);
-};
-
-/* Hack alert: Declare these as arrays so we can treat the name of the single
-   object as the address */
-PN_EXTERN extern const pn_class_t PN_DEFAULT[];
-PN_EXTERN extern const pn_class_t PN_OBJECT[];
-PN_EXTERN extern const pn_class_t PN_VOID[];
-PN_EXTERN extern const pn_class_t PN_WEAKREF[];
-
-PN_EXTERN void pn_object_incref(void *object);
-
-#define PN_CLASSCLASS(PREFIX) PREFIX ## __class
-
-#define PN_CLASS(PREFIX) {                      \
-    #PREFIX,                                    \
-    CID_ ## PREFIX,                             \
-    NULL,                                       \
-    PREFIX ## _initialize,                      \
-    NULL,                                       \
-    NULL,                                       \
-    NULL,                                       \
-    PREFIX ## _finalize,                        \
-    NULL,                                       \
-    PREFIX ## _hashcode,                        \
-    PREFIX ## _compare,                         \
-    PREFIX ## _inspect                          \
-}
-
-#define PN_METACLASS(PREFIX) {                  \
-    #PREFIX,                                    \
-    CID_ ## PREFIX,                             \
-    PREFIX ## _new,                             \
-    PREFIX ## _initialize,                      \
-    PREFIX ## _incref,                          \
-    PREFIX ## _decref,                          \
-    PREFIX ## _refcount,                        \
-    PREFIX ## _finalize,                        \
-    PREFIX ## _free,                            \
-    PREFIX ## _hashcode,                        \
-    PREFIX ## _compare,                         \
-    PREFIX ## _inspect                          \
-}
-
 PN_EXTERN pn_class_t *pn_class_create(const char *name,
                                       void (*initialize)(void*),
                                       void (*finalize)(void*),
@@ -109,147 +40,42 @@ PN_EXTERN pn_class_t *pn_class_create(const char *name,
                                       void (*decref)(void*),
                                       int (*refcount)(void*));
 
-PN_EXTERN void *pn_void_new(const pn_class_t *clazz, size_t size);
-PN_EXTERN void pn_void_incref(void *object);
-PN_EXTERN void pn_void_decref(void *object);
-PN_EXTERN int pn_void_refcount(void *object);
-
-/* Class to identify a plain C struct in a pn_event_t. No refcounting or memory management. */
-#define PN_STRUCT_CLASSDEF(PREFIX)                  \
-const pn_class_t PN_CLASSCLASS(PREFIX)[] = {{       \
-  #PREFIX,                                          \
-  CID_ ## PREFIX,                                   \
-  NULL, /*_new*/                                    \
-  NULL, /*_initialize*/                             \
-  pn_void_incref,                                   \
-  pn_void_decref,                                   \
-  pn_void_refcount,                                 \
-  NULL, /* _finalize */                             \
-  NULL, /* _free */                                 \
-  NULL, /* _hashcode */                             \
-  NULL, /* _compare */                              \
-  NULL, /* _inspect */                              \
-}};                                                 \
-
-PN_EXTERN pn_cid_t pn_class_id(const pn_class_t *clazz);
-PN_EXTERN const char *pn_class_name(const pn_class_t *clazz);
 PN_EXTERN void *pn_class_new(const pn_class_t *clazz, size_t size);
+PN_EXTERN const char *pn_class_name(const pn_class_t *clazz);
+PN_EXTERN pn_cid_t pn_class_id(const pn_class_t *clazz);
 
-PN_EXTERN void *pn_class_incref(const pn_class_t *clazz, void *object);
-PN_EXTERN int pn_class_refcount(const pn_class_t *clazz, void *object);
-PN_EXTERN int pn_class_decref(const pn_class_t *clazz, void *object);
-
-PN_EXTERN void pn_class_free(const pn_class_t *clazz, void *object);
-
-PN_EXTERN intptr_t pn_class_compare(const pn_class_t *clazz, void *a, void *b);
-PN_EXTERN bool pn_class_equals(const pn_class_t *clazz, void *a, void *b);
-PN_EXTERN int pn_class_inspect(const pn_class_t *clazz, void *object, pn_string_t *dst);
-
-/* pn_incref, pn_decref and pn_refcount are for internal use by the proton
- *   library, the should not be called by application code. Application code
- *   should use the appropriate pn_*_free function (pn_link_free, pn_session_free
- *   etc.) when it is finished with a proton value. Proton values should only be
- *   used when handling a pn_event_t that refers to them.
- */
+PN_EXTERN const pn_class_t *pn_class(void* object);
 PN_EXTERN void *pn_incref(void *object);
 PN_EXTERN int pn_decref(void *object);
 PN_EXTERN int pn_refcount(void *object);
 PN_EXTERN void pn_free(void *object);
-PN_EXTERN const pn_class_t *pn_class(void* object);
-PN_EXTERN uintptr_t pn_hashcode(void *object);
-PN_EXTERN intptr_t pn_compare(void *a, void *b);
-PN_EXTERN bool pn_equals(void *a, void *b);
-PN_EXTERN int pn_inspect(void *object, pn_string_t *dst);
 PN_EXTERN char *pn_tostring(void *object);
 
-PN_EXTERN pn_list_t *pn_list(const pn_class_t *clazz, size_t capacity);
-PN_EXTERN size_t pn_list_size(pn_list_t *list);
-PN_EXTERN void *pn_list_get(pn_list_t *list, int index);
-PN_EXTERN void pn_list_set(pn_list_t *list, int index, void *value);
-PN_EXTERN int pn_list_add(pn_list_t *list, void *value);
-PN_EXTERN void *pn_list_pop(pn_list_t *list);
-PN_EXTERN ssize_t pn_list_index(pn_list_t *list, void *value);
-PN_EXTERN bool pn_list_remove(pn_list_t *list, void *value);
-PN_EXTERN void pn_list_del(pn_list_t *list, int index, int n);
-PN_EXTERN void pn_list_clear(pn_list_t *list);
-PN_EXTERN void pn_list_iterator(pn_list_t *list, pn_iterator_t *iter);
-PN_EXTERN void pn_list_minpush(pn_list_t *list, void *value);
-PN_EXTERN void *pn_list_minpop(pn_list_t *list);
-
-PN_EXTERN pn_map_t *pn_map(const pn_class_t *key, const pn_class_t *value,
-                           size_t capacity, float load_factor);
-PN_EXTERN size_t pn_map_size(pn_map_t *map);
-PN_EXTERN int pn_map_put(pn_map_t *map, void *key, void *value);
-PN_EXTERN void *pn_map_get(pn_map_t *map, void *key);
-PN_EXTERN void pn_map_del(pn_map_t *map, void *key);
-PN_EXTERN pn_handle_t pn_map_head(pn_map_t *map);
-PN_EXTERN pn_handle_t pn_map_next(pn_map_t *map, pn_handle_t entry);
-PN_EXTERN void *pn_map_key(pn_map_t *map, pn_handle_t entry);
-PN_EXTERN void *pn_map_value(pn_map_t *map, pn_handle_t entry);
-
-PN_EXTERN pn_hash_t *pn_hash(const pn_class_t *clazz, size_t capacity, float load_factor);
-PN_EXTERN size_t pn_hash_size(pn_hash_t *hash);
-PN_EXTERN int pn_hash_put(pn_hash_t *hash, uintptr_t key, void *value);
-PN_EXTERN void *pn_hash_get(pn_hash_t *hash, uintptr_t key);
-PN_EXTERN void pn_hash_del(pn_hash_t *hash, uintptr_t key);
-PN_EXTERN pn_handle_t pn_hash_head(pn_hash_t *hash);
-PN_EXTERN pn_handle_t pn_hash_next(pn_hash_t *hash, pn_handle_t entry);
-PN_EXTERN uintptr_t pn_hash_key(pn_hash_t *hash, pn_handle_t entry);
-PN_EXTERN void *pn_hash_value(pn_hash_t *hash, pn_handle_t entry);
-
-PN_EXTERN pn_string_t *pn_string(const char *bytes);
-PN_EXTERN pn_string_t *pn_stringn(const char *bytes, size_t n);
-PN_EXTERN const char *pn_string_get(pn_string_t *string);
-PN_EXTERN size_t pn_string_size(pn_string_t *string);
-PN_EXTERN int pn_string_set(pn_string_t *string, const char *bytes);
-PN_EXTERN int pn_string_setn(pn_string_t *string, const char *bytes, size_t n);
-PN_EXTERN ssize_t pn_string_put(pn_string_t *string, char *dst);
-PN_EXTERN void pn_string_clear(pn_string_t *string);
-PN_EXTERN int pn_string_format(pn_string_t *string, const char *format, ...)
-#ifdef __GNUC__
-  __attribute__ ((format (printf, 2, 3)))
-#endif
-    ;
-PN_EXTERN int pn_string_vformat(pn_string_t *string, const char *format, va_list ap);
-PN_EXTERN int pn_string_addf(pn_string_t *string, const char *format, ...)
-#ifdef __GNUC__
-  __attribute__ ((format (printf, 2, 3)))
-#endif
-    ;
-PN_EXTERN int pn_string_vaddf(pn_string_t *string, const char *format, va_list ap);
-PN_EXTERN int pn_string_grow(pn_string_t *string, size_t capacity);
-PN_EXTERN char *pn_string_buffer(pn_string_t *string);
-PN_EXTERN size_t pn_string_capacity(pn_string_t *string);
-PN_EXTERN int pn_string_resize(pn_string_t *string, size_t size);
-PN_EXTERN int pn_string_copy(pn_string_t *string, pn_string_t *src);
-
-PN_EXTERN pn_iterator_t *pn_iterator(void);
-PN_EXTERN void *pn_iterator_start(pn_iterator_t *iterator,
-                                  pn_iterator_next_t next, size_t size);
-PN_EXTERN void *pn_iterator_next(pn_iterator_t *iterator);
-
 #define PN_LEGCTX ((pn_handle_t) 0)
 
 /**
-   PN_HANDLE is a trick to define a unique identifier by using the address of a static variable.
-   You MUST NOT use it in a .h file, since it must be defined uniquely in one compilation unit.
-   Your .h file can provide access to the handle (if needed) via a function. For example:
-
-       /// my_thing.h
-       pn_handle_t get_my_thing(void);
-
-       /// my_thing.c
-       PN_HANDLE(MY_THING);
-       pn_handle_t get_my_thing(void) { return MY_THING; }
-
-   Note that the name "MY_THING" is not exported and is not required to be
-   unique except in the .c file. The linker will guarantee that the *address* of
-   MY_THING, as returned by get_my_thing() *is* unique across the entire linked
-   executable.
+ *   PN_HANDLE is a trick to define a unique identifier by using the address of a static variable.
+ *   You MUST NOT use it in a .h file, since it must be defined uniquely in one compilation unit.
+ *   Your .h file can provide access to the handle (if needed) via a function. For example:
+ *
+ *       /// my_thing.h
+ *       pn_handle_t get_my_thing(void);
+ *
+ *       /// my_thing.c
+ *       PN_HANDLE(MY_THING);
+ *       pn_handle_t get_my_thing(void) { return MY_THING; }
+ *
+ *   Note that the name "MY_THING" is not exported and is not required to be
+ *   unique except in the .c file. The linker will guarantee that the *address* of
+ *   MY_THING, as returned by get_my_thing() *is* unique across the entire linked
+ *   executable.
  */
 #define PN_HANDLE(name) \
-  static const char _PN_HANDLE_ ## name = 0; \
-  static const pn_handle_t name = ((pn_handle_t) &_PN_HANDLE_ ## name);
+static const char _PN_HANDLE_ ## name = 0; \
+static const pn_handle_t name = ((pn_handle_t) &_PN_HANDLE_ ## name);
+
+PN_EXTERN extern const pn_class_t *PN_OBJECT;
+PN_EXTERN extern const pn_class_t *PN_VOID;
 
 PN_EXTERN pn_record_t *pn_record(void);
 PN_EXTERN void pn_record_def(pn_record_t *record, pn_handle_t key, const pn_class_t *clazz);
diff --git a/c/include/proton/reactor.h b/c/include/proton/reactor.h
index fc96fa9e7..4fcd1997a 100644
--- a/c/include/proton/reactor.h
+++ b/c/include/proton/reactor.h
@@ -42,6 +42,7 @@ typedef struct pn_reactor_t pn_reactor_t;
 typedef struct pn_acceptor_t pn_acceptor_t;
 typedef struct pn_timer_t pn_timer_t;
 typedef struct pn_task_t pn_task_t;
+struct pn_list_t;
 
 PNX_EXTERN pn_handler_t *pn_handler(void (*dispatch)(pn_handler_t *, pn_event_t *, pn_event_type_t));
 PNX_EXTERN pn_handler_t *pn_handler_new(void (*dispatch)(pn_handler_t *, pn_event_t *, pn_event_type_t), size_t size,
@@ -65,7 +66,7 @@ PNX_EXTERN pn_handler_t *pn_reactor_get_global_handler(pn_reactor_t *reactor);
 PNX_EXTERN void pn_reactor_set_global_handler(pn_reactor_t *reactor, pn_handler_t *handler);
 PNX_EXTERN pn_handler_t *pn_reactor_get_handler(pn_reactor_t *reactor);
 PNX_EXTERN void pn_reactor_set_handler(pn_reactor_t *reactor, pn_handler_t *handler);
-PNX_EXTERN pn_list_t *pn_reactor_children(pn_reactor_t *reactor);
+PNX_EXTERN struct pn_list_t *pn_reactor_children(pn_reactor_t *reactor);
 PNX_EXTERN pn_selectable_t *pn_reactor_selectable(pn_reactor_t *reactor);
 PNX_EXTERN void pn_reactor_update(pn_reactor_t *reactor, pn_selectable_t *selectable);
 PNX_EXTERN pn_acceptor_t *pn_reactor_acceptor(pn_reactor_t *reactor, const char *host, const char *port,
diff --git a/c/src/core/buffer.h b/c/src/core/buffer.h
index b9bd7573d..0b3f8fa77 100644
--- a/c/src/core/buffer.h
+++ b/c/src/core/buffer.h
@@ -23,9 +23,10 @@
  */
 
 #include <proton/import_export.h>
-#include <proton/object.h>
 #include <proton/types.h>
 
+#include "core/object_private.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/c/src/core/event.c b/c/src/core/event.c
index 3f81f7075..13eefdd41 100644
--- a/c/src/core/event.c
+++ b/c/src/core/event.c
@@ -18,11 +18,14 @@
  * under the License.
  *
  */
-#include <stdio.h>
+
 #include <proton/object.h>
 #include <proton/event.h>
-#include <proton/reactor.h>
+
+#include "core/object_private.h"
+
 #include <assert.h>
+#include <stdio.h>
 
 struct pn_collector_t {
   pn_list_t *pool;
diff --git a/c/src/core/memory.h b/c/src/core/memory.h
index 23a448ad3..d9818fc22 100644
--- a/c/src/core/memory.h
+++ b/c/src/core/memory.h
@@ -22,7 +22,7 @@
  *
  */
 
-#include <proton/object.h>
+#include "core/object_private.h"
 
 #include <stddef.h>
 
diff --git a/c/src/core/object/object.c b/c/src/core/object/object.c
index e498f9fb0..2b2eadf23 100644
--- a/c/src/core/object/object.c
+++ b/c/src/core/object/object.c
@@ -49,7 +49,8 @@ int pn_void_refcount(void *object) { return -1; }
 #define pn_void_compare NULL
 #define pn_void_inspect NULL
 
-const pn_class_t PN_VOID[] = {PN_METACLASS(pn_void)};
+static const pn_class_t PN_VOID_S = PN_METACLASS(pn_void);
+const pn_class_t *PN_VOID = &PN_VOID_S;
 
 typedef struct {
   const pn_class_t *clazz;
@@ -461,4 +462,5 @@ int pn_strongref_refcount(void *object)
 #define pn_strongref_compare pn_compare
 #define pn_strongref_inspect pn_inspect
 
-const pn_class_t PN_OBJECT[] = {PN_METACLASS(pn_strongref)};
+static const pn_class_t PN_OBJECT_S = PN_METACLASS(pn_strongref);
+const pn_class_t *PN_OBJECT = &PN_OBJECT_S;
diff --git a/c/include/proton/object.h b/c/src/core/object_private.h
similarity index 64%
copy from c/include/proton/object.h
copy to c/src/core/object_private.h
index 771c692c3..9b277c28a 100644
--- a/c/include/proton/object.h
+++ b/c/src/core/object_private.h
@@ -1,5 +1,5 @@
-#ifndef PROTON_OBJECT_H
-#define PROTON_OBJECT_H 1
+#ifndef PROTON_OBJECT_PRIVATE_H
+#define PROTON_OBJECT_PRIVATE_H 1
 
 /*
  *
@@ -22,7 +22,8 @@
  *
  */
 
-#include <proton/cid.h>
+#include "proton/object.h"
+
 #include <proton/types.h>
 #include <stdarg.h>
 #include <proton/type_compat.h>
@@ -39,39 +40,28 @@ extern "C" {
 
 typedef intptr_t pn_shandle_t;
 
-typedef struct pn_string_t pn_string_t;
 typedef struct pn_list_t pn_list_t;
+typedef struct pn_string_t pn_string_t;
 typedef struct pn_map_t pn_map_t;
 typedef struct pn_hash_t pn_hash_t;
 typedef void *(*pn_iterator_next_t)(void *state);
 typedef struct pn_iterator_t pn_iterator_t;
 
 struct pn_class_t {
-  const char *name;
-  pn_cid_t cid;
-  void *(*newinst)(const pn_class_t *, size_t);
-  void (*initialize)(void *);
-  void (*incref)(void *);
-  void (*decref)(void *);
-  int (*refcount)(void *);
-  void (*finalize)(void *);
-  void (*free)(void *);
-  uintptr_t (*hashcode)(void *);
-  intptr_t (*compare)(void *, void *);
-  int (*inspect)(void *, pn_string_t *);
+    const char *name;
+    pn_cid_t cid;
+    void *(*newinst)(const pn_class_t *, size_t);
+    void (*initialize)(void *);
+    void (*incref)(void *);
+    void (*decref)(void *);
+    int (*refcount)(void *);
+    void (*finalize)(void *);
+    void (*free)(void *);
+    uintptr_t (*hashcode)(void *);
+    intptr_t (*compare)(void *, void *);
+    int (*inspect)(void *, pn_string_t *);
 };
 
-/* Hack alert: Declare these as arrays so we can treat the name of the single
-   object as the address */
-PN_EXTERN extern const pn_class_t PN_DEFAULT[];
-PN_EXTERN extern const pn_class_t PN_OBJECT[];
-PN_EXTERN extern const pn_class_t PN_VOID[];
-PN_EXTERN extern const pn_class_t PN_WEAKREF[];
-
-PN_EXTERN void pn_object_incref(void *object);
-
-#define PN_CLASSCLASS(PREFIX) PREFIX ## __class
-
 #define PN_CLASS(PREFIX) {                      \
     #PREFIX,                                    \
     CID_ ## PREFIX,                             \
@@ -102,17 +92,12 @@ PN_EXTERN void pn_object_incref(void *object);
     PREFIX ## _inspect                          \
 }
 
-PN_EXTERN pn_class_t *pn_class_create(const char *name,
-                                      void (*initialize)(void*),
-                                      void (*finalize)(void*),
-                                      void (*incref)(void*),
-                                      void (*decref)(void*),
-                                      int (*refcount)(void*));
+/* Hack alert: Declare these as arrays so we can treat the name of the single
+   object as the address */
+PN_EXTERN extern const pn_class_t PN_DEFAULT[];
+PN_EXTERN extern const pn_class_t PN_WEAKREF[];
 
-PN_EXTERN void *pn_void_new(const pn_class_t *clazz, size_t size);
-PN_EXTERN void pn_void_incref(void *object);
-PN_EXTERN void pn_void_decref(void *object);
-PN_EXTERN int pn_void_refcount(void *object);
+#define PN_CLASSCLASS(PREFIX) PREFIX ## __class
 
 /* Class to identify a plain C struct in a pn_event_t. No refcounting or memory management. */
 #define PN_STRUCT_CLASSDEF(PREFIX)                  \
@@ -131,10 +116,6 @@ const pn_class_t PN_CLASSCLASS(PREFIX)[] = {{       \
   NULL, /* _inspect */                              \
 }};                                                 \
 
-PN_EXTERN pn_cid_t pn_class_id(const pn_class_t *clazz);
-PN_EXTERN const char *pn_class_name(const pn_class_t *clazz);
-PN_EXTERN void *pn_class_new(const pn_class_t *clazz, size_t size);
-
 PN_EXTERN void *pn_class_incref(const pn_class_t *clazz, void *object);
 PN_EXTERN int pn_class_refcount(const pn_class_t *clazz, void *object);
 PN_EXTERN int pn_class_decref(const pn_class_t *clazz, void *object);
@@ -145,34 +126,29 @@ PN_EXTERN intptr_t pn_class_compare(const pn_class_t *clazz, void *a, void *b);
 PN_EXTERN bool pn_class_equals(const pn_class_t *clazz, void *a, void *b);
 PN_EXTERN int pn_class_inspect(const pn_class_t *clazz, void *object, pn_string_t *dst);
 
-/* pn_incref, pn_decref and pn_refcount are for internal use by the proton
- *   library, the should not be called by application code. Application code
- *   should use the appropriate pn_*_free function (pn_link_free, pn_session_free
- *   etc.) when it is finished with a proton value. Proton values should only be
- *   used when handling a pn_event_t that refers to them.
- */
-PN_EXTERN void *pn_incref(void *object);
-PN_EXTERN int pn_decref(void *object);
-PN_EXTERN int pn_refcount(void *object);
-PN_EXTERN void pn_free(void *object);
-PN_EXTERN const pn_class_t *pn_class(void* object);
+PN_EXTERN void pn_object_incref(void *object);
+
+PN_EXTERN void *pn_void_new(const pn_class_t *clazz, size_t size);
+PN_EXTERN void pn_void_incref(void *object);
+PN_EXTERN void pn_void_decref(void *object);
+PN_EXTERN int pn_void_refcount(void *object);
+
+PN_EXTERN int pn_inspect(void *object, pn_string_t *dst);
 PN_EXTERN uintptr_t pn_hashcode(void *object);
 PN_EXTERN intptr_t pn_compare(void *a, void *b);
 PN_EXTERN bool pn_equals(void *a, void *b);
-PN_EXTERN int pn_inspect(void *object, pn_string_t *dst);
-PN_EXTERN char *pn_tostring(void *object);
 
 PN_EXTERN pn_list_t *pn_list(const pn_class_t *clazz, size_t capacity);
 PN_EXTERN size_t pn_list_size(pn_list_t *list);
 PN_EXTERN void *pn_list_get(pn_list_t *list, int index);
-PN_EXTERN void pn_list_set(pn_list_t *list, int index, void *value);
 PN_EXTERN int pn_list_add(pn_list_t *list, void *value);
-PN_EXTERN void *pn_list_pop(pn_list_t *list);
-PN_EXTERN ssize_t pn_list_index(pn_list_t *list, void *value);
 PN_EXTERN bool pn_list_remove(pn_list_t *list, void *value);
+void pn_list_set(pn_list_t *list, int index, void *value);
+void *pn_list_pop(pn_list_t *list);
+PN_EXTERN ssize_t pn_list_index(pn_list_t *list, void *value);
 PN_EXTERN void pn_list_del(pn_list_t *list, int index, int n);
-PN_EXTERN void pn_list_clear(pn_list_t *list);
-PN_EXTERN void pn_list_iterator(pn_list_t *list, pn_iterator_t *iter);
+void pn_list_clear(pn_list_t *list);
+void pn_list_iterator(pn_list_t *list, pn_iterator_t *iter);
 PN_EXTERN void pn_list_minpush(pn_list_t *list, void *value);
 PN_EXTERN void *pn_list_minpop(pn_list_t *list);
 
@@ -198,66 +174,36 @@ PN_EXTERN uintptr_t pn_hash_key(pn_hash_t *hash, pn_handle_t entry);
 PN_EXTERN void *pn_hash_value(pn_hash_t *hash, pn_handle_t entry);
 
 PN_EXTERN pn_string_t *pn_string(const char *bytes);
-PN_EXTERN pn_string_t *pn_stringn(const char *bytes, size_t n);
 PN_EXTERN const char *pn_string_get(pn_string_t *string);
+PN_EXTERN pn_string_t *pn_stringn(const char *bytes, size_t n);
 PN_EXTERN size_t pn_string_size(pn_string_t *string);
 PN_EXTERN int pn_string_set(pn_string_t *string, const char *bytes);
 PN_EXTERN int pn_string_setn(pn_string_t *string, const char *bytes, size_t n);
-PN_EXTERN ssize_t pn_string_put(pn_string_t *string, char *dst);
-PN_EXTERN void pn_string_clear(pn_string_t *string);
+ssize_t pn_string_put(pn_string_t *string, char *dst);
+void pn_string_clear(pn_string_t *string);
 PN_EXTERN int pn_string_format(pn_string_t *string, const char *format, ...)
 #ifdef __GNUC__
   __attribute__ ((format (printf, 2, 3)))
 #endif
     ;
-PN_EXTERN int pn_string_vformat(pn_string_t *string, const char *format, va_list ap);
+int pn_string_vformat(pn_string_t *string, const char *format, va_list ap);
 PN_EXTERN int pn_string_addf(pn_string_t *string, const char *format, ...)
 #ifdef __GNUC__
-  __attribute__ ((format (printf, 2, 3)))
+__attribute__ ((format (printf, 2, 3)))
 #endif
-    ;
-PN_EXTERN int pn_string_vaddf(pn_string_t *string, const char *format, va_list ap);
-PN_EXTERN int pn_string_grow(pn_string_t *string, size_t capacity);
-PN_EXTERN char *pn_string_buffer(pn_string_t *string);
-PN_EXTERN size_t pn_string_capacity(pn_string_t *string);
-PN_EXTERN int pn_string_resize(pn_string_t *string, size_t size);
-PN_EXTERN int pn_string_copy(pn_string_t *string, pn_string_t *src);
+;
+int pn_string_vaddf(pn_string_t *string, const char *format, va_list ap);
+int pn_string_grow(pn_string_t *string, size_t capacity);
+char *pn_string_buffer(pn_string_t *string);
+size_t pn_string_capacity(pn_string_t *string);
+int pn_string_resize(pn_string_t *string, size_t size);
+int pn_string_copy(pn_string_t *string, pn_string_t *src);
 
 PN_EXTERN pn_iterator_t *pn_iterator(void);
 PN_EXTERN void *pn_iterator_start(pn_iterator_t *iterator,
-                                  pn_iterator_next_t next, size_t size);
+                        pn_iterator_next_t next, size_t size);
 PN_EXTERN void *pn_iterator_next(pn_iterator_t *iterator);
 
-#define PN_LEGCTX ((pn_handle_t) 0)
-
-/**
-   PN_HANDLE is a trick to define a unique identifier by using the address of a static variable.
-   You MUST NOT use it in a .h file, since it must be defined uniquely in one compilation unit.
-   Your .h file can provide access to the handle (if needed) via a function. For example:
-
-       /// my_thing.h
-       pn_handle_t get_my_thing(void);
-
-       /// my_thing.c
-       PN_HANDLE(MY_THING);
-       pn_handle_t get_my_thing(void) { return MY_THING; }
-
-   Note that the name "MY_THING" is not exported and is not required to be
-   unique except in the .c file. The linker will guarantee that the *address* of
-   MY_THING, as returned by get_my_thing() *is* unique across the entire linked
-   executable.
- */
-#define PN_HANDLE(name) \
-  static const char _PN_HANDLE_ ## name = 0; \
-  static const pn_handle_t name = ((pn_handle_t) &_PN_HANDLE_ ## name);
-
-PN_EXTERN pn_record_t *pn_record(void);
-PN_EXTERN void pn_record_def(pn_record_t *record, pn_handle_t key, const pn_class_t *clazz);
-PN_EXTERN bool pn_record_has(pn_record_t *record, pn_handle_t key);
-PN_EXTERN void *pn_record_get(pn_record_t *record, pn_handle_t key);
-PN_EXTERN void pn_record_set(pn_record_t *record, pn_handle_t key, void *value);
-PN_EXTERN void pn_record_clear(pn_record_t *record);
-
 /**
  * @endcond
  */
@@ -266,4 +212,4 @@ PN_EXTERN void pn_record_clear(pn_record_t *record);
 }
 #endif
 
-#endif /* object.h */
+#endif // PROTON_OBJECT_PRIVATE_H
diff --git a/c/src/core/value_dump.h b/c/src/core/value_dump.h
index 0f6418f5a..3da41249c 100644
--- a/c/src/core/value_dump.h
+++ b/c/src/core/value_dump.h
@@ -24,6 +24,8 @@
 
 #include "proton/types.h"
 
+#include "core/object_private.h"
+
 struct pn_fixed_string_t;
 size_t pni_value_dump(pn_bytes_t frame, struct pn_fixed_string_t *output);
 
diff --git a/c/src/handlers/handshaker.c b/c/src/handlers/handshaker.c
index f52ed86da..6bf42150c 100644
--- a/c/src/handlers/handshaker.c
+++ b/c/src/handlers/handshaker.c
@@ -19,10 +19,14 @@
  *
  */
 
+#include <proton/handlers.h>
+
 #include <proton/connection.h>
 #include <proton/session.h>
 #include <proton/link.h>
-#include <proton/handlers.h>
+
+#include "core/object_private.h"
+
 #include <assert.h>
 
 static void pn_handshaker_dispatch(pn_handler_t *handler, pn_event_t *event, pn_event_type_t type) {
diff --git a/c/src/handlers/iohandler.c b/c/src/handlers/iohandler.c
index f8357c5b0..86d767a82 100644
--- a/c/src/handlers/iohandler.c
+++ b/c/src/handlers/iohandler.c
@@ -19,12 +19,15 @@
  *
  */
 
+#include <proton/handlers.h>
+
+#include <proton/transport.h>
+
+#include "core/object_private.h"
 #include "reactor/io.h"
 #include "reactor/reactor.h"
 #include "reactor/selector.h"
 
-#include <proton/handlers.h>
-#include <proton/transport.h>
 #include <assert.h>
 
 static const char pni_selector_handle = 0;
diff --git a/c/src/messenger/subscription.c b/c/src/messenger/subscription.c
index c10d3c7cb..b692e1a17 100644
--- a/c/src/messenger/subscription.c
+++ b/c/src/messenger/subscription.c
@@ -22,11 +22,13 @@
 #include "subscription.h"
 
 #include <proton/messenger.h>
-#include <proton/object.h>
+
+#include "core/object_private.h"
+#include "messenger.h"
+
 #include <assert.h>
 #include <string.h>
 
-#include "messenger.h"
 
 struct pn_subscription_t {
   pn_messenger_t *messenger;
diff --git a/c/src/messenger/subscription.h b/c/src/messenger/subscription.h
index 382b25a9c..38ff4cdae 100644
--- a/c/src/messenger/subscription.h
+++ b/c/src/messenger/subscription.h
@@ -25,6 +25,8 @@
 #include <proton/messenger.h>
 #include <proton/object.h>
 
+#include "core/object_private.h"
+
 extern const pn_class_t PN_CLASSCLASS(pn_subscription);
 
 pn_subscription_t *pn_subscription(pn_messenger_t *messenger,
diff --git a/c/src/reactor/acceptor.c b/c/src/reactor/acceptor.c
index cc3b7d3ee..9fb3fda69 100644
--- a/c/src/reactor/acceptor.c
+++ b/c/src/reactor/acceptor.c
@@ -28,6 +28,8 @@
 #include "selectable.h"
 #include "selector.h"
 
+#include "core/object_private.h"
+
 #include <string.h>
 
 pn_selectable_t *pn_reactor_selectable_transport(pn_reactor_t *reactor, pn_socket_t sock, pn_transport_t *transport);
diff --git a/c/src/reactor/connection.c b/c/src/reactor/connection.c
index 390a9fa2f..9189d954f 100644
--- a/c/src/reactor/connection.c
+++ b/c/src/reactor/connection.c
@@ -22,18 +22,20 @@
 #define PN_USE_DEPRECATED_API 1
 
 #include <proton/connection.h>
-#include <proton/object.h>
 #include <proton/sasl.h>
 #include <proton/ssl.h>
 #include <proton/transport.h>
 #include <proton/url.h>
-#include <assert.h>
-#include <stdio.h>
-#include <string.h>
+
+#include "core/object_private.h"
 #include "io.h"
 #include "selectable.h"
 #include "reactor.h"
 
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+
 // XXX: overloaded for both directions
 PN_HANDLE(PN_TRANCTX)
 PN_HANDLE(PNI_CONN_PEER_ADDRESS)
diff --git a/c/src/reactor/handler.c b/c/src/reactor/handler.c
index 5cb3fe101..0bd2965ef 100644
--- a/c/src/reactor/handler.c
+++ b/c/src/reactor/handler.c
@@ -19,9 +19,11 @@
  *
  */
 
-#include <proton/object.h>
 #include <proton/reactor.h>
 #include <proton/event.h>
+
+#include "core/object_private.h"
+
 #include <string.h>
 #include <assert.h>
 
diff --git a/c/src/reactor/io/posix/io.c b/c/src/reactor/io/posix/io.c
index 2ddb5c0c1..1c70b8c96 100644
--- a/c/src/reactor/io/posix/io.c
+++ b/c/src/reactor/io/posix/io.c
@@ -19,11 +19,10 @@
  *
  */
 
+#include "core/object_private.h"
+#include "platform/platform.h" // pn_i_error_from_errno
 #include "reactor/io.h"
 #include "reactor/selector.h"
-#include "platform/platform.h" // pn_i_error_from_errno
-
-#include <proton/object.h>
 
 #include <ctype.h>
 #include <errno.h>
diff --git a/c/src/reactor/io/windows/iocp.h b/c/src/reactor/io/windows/iocp.h
index 327e89d3c..1a6bef76b 100644
--- a/c/src/reactor/io/windows/iocp.h
+++ b/c/src/reactor/io/windows/iocp.h
@@ -23,10 +23,11 @@
  */
 
 #include <proton/import_export.h>
-#include <proton/object.h>
 #include <proton/selectable.h>
 #include <proton/type_compat.h>
 
+#include "core/object_private.h"
+
 typedef struct pni_acceptor_t pni_acceptor_t;
 typedef struct write_result_t write_result_t;
 typedef struct read_result_t read_result_t;
diff --git a/c/src/reactor/reactor.c b/c/src/reactor/reactor.c
index df92cbe05..dbb9e8e26 100644
--- a/c/src/reactor/reactor.c
+++ b/c/src/reactor/reactor.c
@@ -19,12 +19,12 @@
  *
  */
 
+#include "core/object_private.h"
 #include "io.h"
 #include "reactor.h"
 #include "selectable.h"
 #include "platform/platform.h" // pn_i_now
 
-#include <proton/object.h>
 #include <proton/handlers.h>
 #include <proton/event.h>
 #include <proton/transport.h>
diff --git a/c/src/reactor/selectable.c b/c/src/reactor/selectable.c
index 220d1c9da..257989f3e 100644
--- a/c/src/reactor/selectable.c
+++ b/c/src/reactor/selectable.c
@@ -22,8 +22,8 @@
 #include "selectable.h"
 
 #include <proton/error.h>
-#include <proton/object.h>
 
+#include "core/object_private.h"
 #include "io.h"
 
 #include <assert.h>
diff --git a/c/src/reactor/selectable.h b/c/src/reactor/selectable.h
index 251e6e238..433d6656b 100644
--- a/c/src/reactor/selectable.h
+++ b/c/src/reactor/selectable.h
@@ -29,6 +29,8 @@
 #include <proton/selectable.h>
 #include <proton/object.h>
 
+#include "core/object_private.h"
+
 extern const pn_class_t PN_CLASSCLASS(pn_selectable);
 
 void *pni_selectable_get_context(pn_selectable_t *selectable);
diff --git a/c/src/reactor/timer.c b/c/src/reactor/timer.c
index 5283a8fea..1f552b349 100644
--- a/c/src/reactor/timer.c
+++ b/c/src/reactor/timer.c
@@ -19,8 +19,10 @@
  *
  */
 
-#include <proton/object.h>
 #include <proton/reactor.h>
+
+#include "core/object_private.h"
+
 #include <assert.h>
 
 struct pn_task_t {
diff --git a/c/tests/event_test.cpp b/c/tests/event_test.cpp
index 3d2faf695..4045a8fd7 100644
--- a/c/tests/event_test.cpp
+++ b/c/tests/event_test.cpp
@@ -19,10 +19,11 @@
  *
  */
 
-#include "./pn_test.hpp"
+#include "pn_test.hpp"
 
 #include <proton/event.h>
-#include <proton/object.h>
+
+#include "core/object_private.h"
 
 TEST_CASE("event_collector") {
   pn_collector_t *collector = pn_collector();
diff --git a/c/tests/object_test.cpp b/c/tests/object_test.cpp
index bd9d27eeb..52fbab9e6 100644
--- a/c/tests/object_test.cpp
+++ b/c/tests/object_test.cpp
@@ -19,9 +19,10 @@
  *
  */
 
-#include "./pn_test.hpp"
+#include "pn_test.hpp"
+
+#include "core/object_private.h"
 
-#include <proton/object.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
diff --git a/c/tools/reactor-recv.c b/c/tools/reactor-recv.c
index 0d2fb5b55..649337cd4 100644
--- a/c/tools/reactor-recv.c
+++ b/c/tools/reactor-recv.c
@@ -33,6 +33,7 @@
 #include "proton/url.h"
 #include "msgr-common.h"
 
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
diff --git a/python/cproton.i b/python/cproton.i
index 7a3407ee1..125999ca8 100644
--- a/python/cproton.i
+++ b/python/cproton.i
@@ -26,11 +26,11 @@
 /* TODO: Remove once pn_work_head() and related have been removed from Proton */
 #define PN_USE_DEPRECATED_API 1
 
+#include <proton/cid.h>
 #include <proton/engine.h>
 #include <proton/message.h>
 #include <proton/object.h>
 #include <proton/sasl.h>
-#include <proton/messenger.h>
 #include <proton/ssl.h>
 
 /*
diff --git a/ruby/cproton.i b/ruby/cproton.i
index 00b3593dc..ae2a7ef7b 100644
--- a/ruby/cproton.i
+++ b/ruby/cproton.i
@@ -22,6 +22,7 @@
 #define PN_USE_DEPRECATED_API 1
 
 #include <proton/connection_driver.h>
+#include <proton/cid.h>
 #include <proton/engine.h>
 #include <proton/handlers.h>
 #include <proton/message.h>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[qpid-proton] 04/04: PROTON-2562: Finish using fixed size buffers for logging output

Posted by as...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

astitcher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git

commit 0c240d12a2ceca3e361a4c6efce86a984c316927
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Wed Jun 29 13:25:43 2022 +0100

    PROTON-2562: Finish using fixed size buffers for logging output
    
    Remove the scratch pn_string_t member of the logger as this is no longer
    needed.
---
 c/src/core/logger.c         | 17 ++++++++++-------
 c/src/core/logger_private.h |  1 -
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/c/src/core/logger.c b/c/src/core/logger.c
index e0b7e2fea..7e429b349 100644
--- a/c/src/core/logger.c
+++ b/c/src/core/logger.c
@@ -48,13 +48,10 @@ void pni_logger_init(pn_logger_t *logger)
 {
   *logger = the_default_logger;
   logger->sink_context = (intptr_t) logger;
-  logger->scratch = pn_string(NULL);
 }
 
 void pni_logger_fini(pn_logger_t *logger)
 {
-  pn_free(logger->scratch);
-  logger->scratch = NULL;
 }
 
 #define LOGLEVEL(x)   {sizeof(#x)-1, #x, PN_LEVEL_ ## x, PN_LEVEL_ ## x-1}
@@ -118,7 +115,6 @@ void pni_init_default_logger(void)
 
   the_default_logger.sev_mask = (pn_log_level_t) (the_default_logger.sev_mask | sev_mask);
   the_default_logger.sub_mask = (pn_log_subsystem_t) (the_default_logger.sub_mask | sub_mask);
-  the_default_logger.scratch = pn_string(NULL);
 }
 
 void pni_fini_default_logger(void)
@@ -229,12 +225,16 @@ void pni_logger_log_raw(pn_logger_t *logger, pn_log_subsystem_t subsystem, pn_lo
 
 void pni_logger_log_msg_inspect(pn_logger_t *logger, pn_log_subsystem_t subsystem, pn_log_level_t severity, void* object, const char *fmt, ...) {
   va_list ap;
+  char buf[1024];
+  pn_fixed_string_t out = pn_fixed_string(buf, sizeof(buf));
 
   va_start(ap, fmt);
-  pn_string_vformat(logger->scratch, fmt, ap);
+  pn_fixed_string_vaddf(&out, fmt, ap);
   va_end(ap);
-  pn_inspect(object, logger->scratch);
-  pni_logger_log(logger, subsystem, severity, pn_string_get(logger->scratch));
+
+  pn_finspect(object, &out);
+  pn_fixed_string_terminate(&out);
+  pni_logger_log(logger, subsystem, severity, buf);
 }
 
 void pni_logger_log_msg_frame(pn_logger_t *logger, pn_log_subsystem_t subsystem, pn_log_level_t severity, pn_bytes_t frame, const char *fmt, ...) {
@@ -245,6 +245,7 @@ void pni_logger_log_msg_frame(pn_logger_t *logger, pn_log_subsystem_t subsystem,
   va_start(ap, fmt);
   pn_fixed_string_vaddf(&output, fmt, ap);
   va_end(ap);
+
   size_t psize = pni_value_dump(frame, &output);
   pn_bytes_t payload = {.size=frame.size-psize, .start=frame.start+psize};
   if (payload.size>0) {
@@ -257,6 +258,7 @@ void pni_logger_log_msg_frame(pn_logger_t *logger, pn_log_subsystem_t subsystem,
     output.position -= sizeof(truncated);
     pn_fixed_string_append(&output, pn_string_const(truncated, sizeof(truncated)));
   }
+  pn_fixed_string_terminate(&output);
   pni_logger_log(logger, subsystem, severity, buf);
 }
 
@@ -278,6 +280,7 @@ void pni_logger_vlogf(pn_logger_t *logger, pn_log_subsystem_t subsystem, pn_log_
     output.position -= sizeof(truncated);
     pn_fixed_string_append(&output, pn_string_const(truncated, sizeof(truncated)));
   }
+  pn_fixed_string_terminate(&output);
   pni_logger_log(logger, subsystem, severity, buf);
 }
 
diff --git a/c/src/core/logger_private.h b/c/src/core/logger_private.h
index 78276356e..27625993c 100644
--- a/c/src/core/logger_private.h
+++ b/c/src/core/logger_private.h
@@ -30,7 +30,6 @@ extern "C" {
 struct pn_logger_t {
     pn_log_sink_t sink;
     intptr_t      sink_context;
-    pn_string_t  *scratch;
     uint16_t      sub_mask;
     uint16_t      sev_mask;
 };


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[qpid-proton] 01/04: PROTON-2562: Use fixed buffer for logging raw byte output

Posted by as...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

astitcher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git

commit 730bdaab715118fb9ced1ce63705e127fb0de8fe
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Fri Jun 24 11:47:41 2022 +0100

    PROTON-2562: Use fixed buffer for logging raw byte output
    
    Also chenage the format of the output to be a 'hexdump' type output.
---
 c/src/core/logger.c | 30 ++++++++++++++++++++++++++----
 1 file changed, 26 insertions(+), 4 deletions(-)

diff --git a/c/src/core/logger.c b/c/src/core/logger.c
index 2ee9e1dd1..e0b7e2fea 100644
--- a/c/src/core/logger.c
+++ b/c/src/core/logger.c
@@ -199,10 +199,32 @@ void pni_logger_log_data(pn_logger_t *logger, pn_log_subsystem_t subsystem, pn_l
 
 void pni_logger_log_raw(pn_logger_t *logger, pn_log_subsystem_t subsystem, pn_log_level_t severity, pn_buffer_t *output, size_t size)
 {
-  pn_string_set(logger->scratch, "\"");
-  pn_buffer_quote(output, logger->scratch, size);
-  pn_string_addf(logger->scratch, "\"");
-  pni_logger_log(logger, subsystem, severity, pn_string_get(logger->scratch));
+  char buf[256];
+
+  pn_bytes_t bytes = pn_buffer_bytes(output);
+  const char *start = &bytes.start[bytes.size-size];
+  for (unsigned i = 0; i < size; i+=16) {
+    pn_fixed_string_t out = pn_fixed_string(buf, sizeof(buf));
+    pn_fixed_string_addf(&out, "%04x/%04x: ", i, size);
+    for (unsigned j = 0; j<16; j++) {
+      if (i+j<size) {
+        pn_fixed_string_addf(&out, "%02hhx ", start[i+j]);
+      } else {
+        pn_fixed_string_append(&out, pn_string_const("   ", 3));
+      }
+    }
+    for (unsigned j = 0; j<16; j++) {
+      if (i+j>size) break;
+      char c = start[i+j];
+      if (c>32) { // c is signed so the high bit set is negative
+        pn_fixed_string_append(&out, pn_string_const(&c, 1));
+      } else {
+        pn_fixed_string_append(&out, STR_CONST(.));
+      }
+    }
+    pn_fixed_string_terminate(&out);
+    pni_logger_log(logger, subsystem, severity, buf);
+  }
 }
 
 void pni_logger_log_msg_inspect(pn_logger_t *logger, pn_log_subsystem_t subsystem, pn_log_level_t severity, void* object, const char *fmt, ...) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[qpid-proton] 03/04: PROTON-2559: Modify pn_object inspect operation to use pn_fixed_string_t

Posted by as...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

astitcher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git

commit 0836fabc397dbf253578d8ca37f120704f3a8fda
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Wed Jun 29 13:11:59 2022 +0100

    PROTON-2559: Modify pn_object inspect operation to use pn_fixed_string_t
    
    This now allows us to inspect objects without potentially allocating
    an indefinite amount of memory.
    
    Renamed the new operation pn_finspect() and created a compatible
    pn_inspect for any current users (none known)
---
 c/src/core/buffer.h         |   3 +-
 c/src/core/codec.c          | 181 +++++++++++++++++++++++---------------------
 c/src/core/data.h           |   3 +-
 c/src/core/engine.c         |  18 ++---
 c/src/core/event.c          |  35 ++++-----
 c/src/core/fixed_string.h   |   3 +
 c/src/core/message.c        | 167 ++++++++++++++--------------------------
 c/src/core/object/list.c    |  17 ++---
 c/src/core/object/map.c     |  23 +++---
 c/src/core/object/object.c  |  54 +++++++++----
 c/src/core/object/string.c  |  18 ++---
 c/src/core/object_private.h |   6 +-
 c/src/core/util.h           |   8 +-
 c/src/core/value_dump.h     |   2 -
 c/src/extra/url.c           |  11 +--
 c/src/reactor/reactor.c     |  10 ++-
 16 files changed, 268 insertions(+), 291 deletions(-)

diff --git a/c/src/core/buffer.h b/c/src/core/buffer.h
index 0b3f8fa77..e205c9b55 100644
--- a/c/src/core/buffer.h
+++ b/c/src/core/buffer.h
@@ -48,7 +48,8 @@ int pn_buffer_defrag(pn_buffer_t *buf);
 pn_bytes_t pn_buffer_bytes(pn_buffer_t *buf);
 pn_rwbytes_t pn_buffer_memory(pn_buffer_t *buf);
 pn_rwbytes_t pn_buffer_free_memory(pn_buffer_t *buf);
-int pn_buffer_quote(pn_buffer_t *buf, pn_string_t *string, size_t n);
+struct pn_string_t;
+int pn_buffer_quote(pn_buffer_t *buf, struct pn_string_t *string, size_t n);
 
 #ifdef __cplusplus
 }
diff --git a/c/src/core/codec.c b/c/src/core/codec.c
index a3047f057..513a994cc 100644
--- a/c/src/core/codec.c
+++ b/c/src/core/codec.c
@@ -36,6 +36,7 @@
 #include "decoder.h"
 #include "encoder.h"
 #include "data.h"
+#include "fixed_string.h"
 #include "logger_private.h"
 #include "memory.h"
 
@@ -109,43 +110,59 @@ static const pn_fields_t *pni_node_fields(pn_data_t *data, pni_node_t *node)
   }
 }
 
-int pni_inspect_atom(pn_atom_t *atom, pn_string_t *str)
+void pni_inspect_atom(pn_atom_t *atom, pn_fixed_string_t *str)
 {
   switch (atom->type) {
   case PN_NULL:
-    return pn_string_addf(str, "null");
+    pn_fixed_string_addf(str, "null");
+    return;
   case PN_BOOL:
-    return pn_string_addf(str, atom->u.as_bool ? "true" : "false");
+    pn_fixed_string_addf(str, atom->u.as_bool ? "true" : "false");
+    return;
   case PN_UBYTE:
-    return pn_string_addf(str, "%" PRIu8, atom->u.as_ubyte);
+    pn_fixed_string_addf(str, "%" PRIu8, atom->u.as_ubyte);
+    return;
   case PN_BYTE:
-    return pn_string_addf(str, "%" PRIi8, atom->u.as_byte);
+    pn_fixed_string_addf(str, "%" PRIi8, atom->u.as_byte);
+    return;
   case PN_USHORT:
-    return pn_string_addf(str, "%" PRIu16, atom->u.as_ushort);
+    pn_fixed_string_addf(str, "%" PRIu16, atom->u.as_ushort);
+    return;
   case PN_SHORT:
-    return pn_string_addf(str, "%" PRIi16, atom->u.as_short);
+    pn_fixed_string_addf(str, "%" PRIi16, atom->u.as_short);
+    return;
   case PN_UINT:
-    return pn_string_addf(str, "%" PRIu32, atom->u.as_uint);
+    pn_fixed_string_addf(str, "%" PRIu32, atom->u.as_uint);
+    return;
   case PN_INT:
-    return pn_string_addf(str, "%" PRIi32, atom->u.as_int);
+    pn_fixed_string_addf(str, "%" PRIi32, atom->u.as_int);
+    return;
   case PN_CHAR:
-    return pn_string_addf(str, "%c",  atom->u.as_char);
+    pn_fixed_string_addf(str, "%c",  atom->u.as_char);
+    return;
   case PN_ULONG:
-    return pn_string_addf(str, "%" PRIu64, atom->u.as_ulong);
+    pn_fixed_string_addf(str, "%" PRIu64, atom->u.as_ulong);
+    return;
   case PN_LONG:
-    return pn_string_addf(str, "%" PRIi64, atom->u.as_long);
+    pn_fixed_string_addf(str, "%" PRIi64, atom->u.as_long);
+    return;
   case PN_TIMESTAMP:
-    return pn_string_addf(str, "%" PRIi64, atom->u.as_timestamp);
+    pn_fixed_string_addf(str, "%" PRIi64, atom->u.as_timestamp);
+    return;
   case PN_FLOAT:
-    return pn_string_addf(str, "%g", atom->u.as_float);
+    pn_fixed_string_addf(str, "%g", atom->u.as_float);
+    return;
   case PN_DOUBLE:
-    return pn_string_addf(str, "%g", atom->u.as_double);
+    pn_fixed_string_addf(str, "%g", atom->u.as_double);
+    return;
   case PN_DECIMAL32:
-    return pn_string_addf(str, "D32(%" PRIu32 ")", atom->u.as_decimal32);
+    pn_fixed_string_addf(str, "D32(%" PRIu32 ")", atom->u.as_decimal32);
+    return;
   case PN_DECIMAL64:
-    return pn_string_addf(str, "D64(%" PRIu64 ")", atom->u.as_decimal64);
+    pn_fixed_string_addf(str, "D64(%" PRIu64 ")", atom->u.as_decimal64);
+    return;
   case PN_DECIMAL128:
-    return pn_string_addf(str, "D128(%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
+    pn_fixed_string_addf(str, "D128(%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
                           "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
                           "%02hhx%02hhx)",
                           atom->u.as_decimal128.bytes[0],
@@ -164,8 +181,9 @@ int pni_inspect_atom(pn_atom_t *atom, pn_string_t *str)
                           atom->u.as_decimal128.bytes[13],
                           atom->u.as_decimal128.bytes[14],
                           atom->u.as_decimal128.bytes[15]);
+    return;
   case PN_UUID:
-    return pn_string_addf(str, "UUID(%02hhx%02hhx%02hhx%02hhx-"
+    pn_fixed_string_addf(str, "UUID(%02hhx%02hhx%02hhx%02hhx-"
                           "%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-"
                           "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx)",
                           atom->u.as_uuid.bytes[0],
@@ -184,11 +202,11 @@ int pni_inspect_atom(pn_atom_t *atom, pn_string_t *str)
                           atom->u.as_uuid.bytes[13],
                           atom->u.as_uuid.bytes[14],
                           atom->u.as_uuid.bytes[15]);
+    return;
   case PN_BINARY:
   case PN_STRING:
   case PN_SYMBOL:
     {
-      int err;
       const char *pfx;
       pn_bytes_t bin = atom->u.as_bytes;
       bool quote;
@@ -213,25 +231,30 @@ int pni_inspect_atom(pn_atom_t *atom, pn_string_t *str)
         break;
       default:
         assert(false);
-        return PN_ERR;
+        return;
       }
 
-      if ((err = pn_string_addf(str, "%s", pfx))) return err;
-      if (quote) if ((err = pn_string_addf(str, "\""))) return err;
-      if ((err = pn_quote(str, bin.start, bin.size))) return err;
-      if (quote) if ((err = pn_string_addf(str, "\""))) return err;
-      return 0;
+      pn_fixed_string_addf(str, "%s", pfx);
+      if (quote) pn_fixed_string_addf(str, "\"");
+      pn_fixed_string_quote(str, bin.start, bin.size);
+      if (quote) pn_fixed_string_addf(str, "\"");
+      return;
     }
   case PN_LIST:
-    return pn_string_addf(str, "<list>");
+    pn_fixed_string_addf(str, "<list>");
+    return;
   case PN_MAP:
-    return pn_string_addf(str, "<map>");
+    pn_fixed_string_addf(str, "<map>");
+    return;
   case PN_ARRAY:
-    return pn_string_addf(str, "<array>");
+    pn_fixed_string_addf(str, "<array>");
+    return;
   case PN_DESCRIBED:
-    return pn_string_addf(str, "<described>");
+    pn_fixed_string_addf(str, "<described>");
+    return;
   default:
-    return pn_string_addf(str, "<undefined: %i>", atom->type);
+    pn_fixed_string_addf(str, "<undefined: %i>", atom->type);
+    return;
   }
 }
 
@@ -248,7 +271,7 @@ static int pni_node_lindex(pn_data_t *data, pni_node_t *node)
 
 int pni_inspect_enter(void *ctx, pn_data_t *data, pni_node_t *node)
 {
-  pn_string_t *str = (pn_string_t *) ctx;
+  pn_fixed_string_t *str = (pn_fixed_string_t *) ctx;
   pn_atom_t *atom = (pn_atom_t *) &node->atom;
 
   pni_node_t *parent = pn_data_node(data, node->parent);
@@ -256,8 +279,6 @@ int pni_inspect_enter(void *ctx, pn_data_t *data, pni_node_t *node)
   pni_node_t *grandparent = parent ? pn_data_node(data, parent->parent) : NULL;
   const pn_fields_t *grandfields = pni_node_fields(data, grandparent);
 
-  int err;
-
   if (grandfields) {
     if (atom->type == PN_NULL) {
       return 0;
@@ -267,32 +288,34 @@ int pni_inspect_enter(void *ctx, pn_data_t *data, pni_node_t *node)
         ? (const char*)FIELD_STRINGPOOL.STRING0+FIELD_FIELDS[grandfields->first_field_index+lindex]
         : NULL;
     if (name) {
-      err = pn_string_addf(str, "%s=", name);
-      if (err) return err;
+      pn_fixed_string_addf(str, "%s=", name);
     }
   }
 
   switch (atom->type) {
   case PN_DESCRIBED:
-    return pn_string_addf(str, "@");
+    pn_fixed_string_addf(str, "@");
+    return 0;
   case PN_ARRAY:
     // XXX: need to fix for described arrays
-    return pn_string_addf(str, "@%s[", pn_type_name(node->type));
+    pn_fixed_string_addf(str, "@%s[", pn_type_name(node->type));
+    return 0;
   case PN_LIST:
-    return pn_string_addf(str, "[");
+    pn_fixed_string_addf(str, "[");
+    return 0;
   case PN_MAP:
-    return pn_string_addf(str, "{");
+    pn_fixed_string_addf(str, "{");
+    return 0;
   default:
     if (fields && node->prev == 0) {
-      err = pn_string_addf(str, "%s", (const char *)FIELD_STRINGPOOL.STRING0+FIELD_NAME[fields->name_index]);
-      if (err) return err;
-      err = pn_string_addf(str, "(");
-      if (err) return err;
-      err = pni_inspect_atom(atom, str);
-      if (err) return err;
-      return pn_string_addf(str, ")");
+      pn_fixed_string_addf(str, "%s", (const char *)FIELD_STRINGPOOL.STRING0+FIELD_NAME[fields->name_index]);
+      pn_fixed_string_addf(str, "(");
+      pni_inspect_atom(atom, str);
+      pn_fixed_string_addf(str, ")");
+      return 0;
     } else {
-      return pni_inspect_atom(atom, str);
+      pni_inspect_atom(atom, str);
+      return 0;
     }
   }
 }
@@ -311,18 +334,15 @@ pni_node_t *pni_next_nonnull(pn_data_t *data, pni_node_t *node)
 
 int pni_inspect_exit(void *ctx, pn_data_t *data, pni_node_t *node)
 {
-  pn_string_t *str = (pn_string_t *) ctx;
-  int err;
+  pn_fixed_string_t *str = (pn_fixed_string_t *) ctx;
 
   switch (node->atom.type) {
   case PN_ARRAY:
   case PN_LIST:
-    err = pn_string_addf(str, "]");
-    if (err) return err;
+    pn_fixed_string_addf(str, "]");
     break;
   case PN_MAP:
-    err = pn_string_addf(str, "}");
-    if (err) return err;
+    pn_fixed_string_addf(str, "}");
     break;
   default:
     break;
@@ -334,15 +354,12 @@ int pni_inspect_exit(void *ctx, pn_data_t *data, pni_node_t *node)
   if (!grandfields || node->atom.type != PN_NULL) {
     if (node->next) {
       if (parent && parent->atom.type == PN_MAP && (pni_node_lindex(data, node) % 2) == 0) {
-        err = pn_string_addf(str, "=");
-        if (err) return err;
+        pn_fixed_string_addf(str, "=");
       } else if (parent && parent->atom.type == PN_DESCRIBED && node->prev == 0) {
-        err = pn_string_addf(str, " ");
-        if (err) return err;
+        pn_fixed_string_addf(str, " ");
       } else {
         if (!grandfields || pni_next_nonnull(data, node)) {
-          err = pn_string_addf(str, ", ");
-          if (err) return err;
+          pn_fixed_string_addf(str, ", ");
         }
       }
     }
@@ -351,11 +368,11 @@ int pni_inspect_exit(void *ctx, pn_data_t *data, pni_node_t *node)
   return 0;
 }
 
-static int pn_data_inspect(void *obj, pn_string_t *dst)
+static void pn_data_inspect(void *obj, pn_fixed_string_t *dst)
 {
   pn_data_t *data = (pn_data_t *) obj;
 
-  return pni_data_traverse(data, pni_inspect_enter, pni_inspect_exit, dst);
+  pni_data_traverse(data, pni_inspect_enter, pni_inspect_exit, dst);
 }
 
 #define pn_data_initialize NULL
@@ -1221,31 +1238,21 @@ int pn_data_scan(pn_data_t *data, const char *fmt, ...)
 
 int pn_data_print(pn_data_t *data)
 {
-  pn_string_t *str = pn_string("");
-  int err = pn_data_inspect(data, str);
-  if (err) {
-    pn_free(str);
-    return err;
-  }
-  printf("%s", pn_string_get(str));
-  pn_free(str);
+  char buf[1024];
+  pn_fixed_string_t str = pn_fixed_string(buf, sizeof(buf));
+  pn_data_inspect(data, &str);
+  pn_fixed_string_terminate(&str);
+  printf("%s", buf);
   return 0;
 }
 
 int pn_data_format(pn_data_t *data, char *bytes, size_t *size)
 {
-  pn_string_t *str = pn_string("");
-  int err = pn_data_inspect(data, str);
-  if (err) return err;
-  if (pn_string_size(str) >= *size) {
-    pn_free(str);
-    return PN_OVERFLOW;
-  } else {
-    pn_string_put(str, bytes);
-    *size = pn_string_size(str);
-    pn_free(str);
-    return 0;
-  }
+  pn_fixed_string_t str = pn_fixed_string(bytes, *size);
+  pn_data_inspect(data, &str);
+  pn_fixed_string_terminate(&str);
+  *size = str.position;
+  return 0;
 }
 
 static size_t pni_data_id(pn_data_t *data, pni_node_t *node)
@@ -1483,13 +1490,14 @@ bool pn_data_lookup(pn_data_t *data, const char *name)
 
 void pn_data_dump(pn_data_t *data)
 {
-  pn_string_t *str = pn_string(0);
   printf("{current=%" PN_ZI ", parent=%" PN_ZI "}\n", (size_t) data->current, (size_t) data->parent);
+  char buf[256];
   for (unsigned i = 0; i < data->size; i++)
   {
     pni_node_t *node = &data->nodes[i];
-    pn_string_setn(str, "", 0);
-    pni_inspect_atom((pn_atom_t *) &node->atom, str);
+    pn_fixed_string_t str = pn_fixed_string(buf, sizeof(buf));
+    pni_inspect_atom((pn_atom_t *) &node->atom, &str);
+    pn_fixed_string_terminate(&str);
     printf("Node %i: prev=%" PN_ZI ", next=%" PN_ZI ", parent=%" PN_ZI ", down=%" PN_ZI 
            ", children=%" PN_ZI ", type=%s (%s)\n",
            i + 1, (size_t) node->prev,
@@ -1497,9 +1505,8 @@ void pn_data_dump(pn_data_t *data)
            (size_t) node->parent,
            (size_t) node->down,
            (size_t) node->children,
-           pn_type_name(node->atom.type), pn_string_get(str));
+           pn_type_name(node->atom.type), buf);
   }
-  pn_free(str);
 }
 
 static pni_node_t *pni_data_add(pn_data_t *data)
diff --git a/c/src/core/data.h b/c/src/core/data.h
index e90e4f29b..97315b495 100644
--- a/c/src/core/data.h
+++ b/c/src/core/data.h
@@ -70,6 +70,7 @@ int pni_data_traverse(pn_data_t *data,
                       int (*exit)(void *ctx, pn_data_t *data, pni_node_t *node),
                       void *ctx);
 
-int pni_inspect_atom(pn_atom_t *atom, pn_string_t *str);
+struct pn_fixed_string_t;
+void pni_inspect_atom(pn_atom_t *atom, struct pn_fixed_string_t *str);
 
 #endif /* data.h */
diff --git a/c/src/core/engine.c b/c/src/core/engine.c
index 3e4385532..aa90a4b31 100644
--- a/c/src/core/engine.c
+++ b/c/src/core/engine.c
@@ -24,6 +24,7 @@
 
 #include "engine-internal.h"
 
+#include "fixed_string.h"
 #include "framing.h"
 #include "memory.h"
 #include "platform/platform.h"
@@ -50,7 +51,7 @@ static void pn_delivery_finalize(void *object);
 #define pn_delivery_initialize NULL
 #define pn_delivery_hashcode NULL
 #define pn_delivery_compare NULL
-static int pn_delivery_inspect(void *obj, pn_string_t *dst);
+static void pn_delivery_inspect(void *obj, pn_fixed_string_t *dst);
 static const pn_class_t PN_CLASSCLASS(pn_delivery) = PN_METACLASS(pn_delivery);
 
 // endpoints
@@ -1518,17 +1519,16 @@ static void pn_disposition_clear(pn_disposition_t *ds)
   pn_condition_clear(&ds->condition);
 }
 
-int pn_delivery_inspect(void *obj, pn_string_t *dst) {
+void pn_delivery_inspect(void *obj, pn_fixed_string_t *dst) {
   pn_delivery_t *d = (pn_delivery_t*)obj;
   const char* dir = pn_link_is_sender(d->link) ? "sending" : "receiving";
   pn_bytes_t bytes = pn_buffer_bytes(d->tag);
-  int err =
-    pn_string_addf(dst, "pn_delivery<%p>{%s, tag=b\"", obj, dir) ||
-    pn_quote(dst, bytes.start, bytes.size) ||
-    pn_string_addf(dst, "\", local=%s, remote=%s}",
-                   pn_disposition_type_name(d->local.type),
-                   pn_disposition_type_name(d->remote.type));
-  return err;
+  pn_fixed_string_addf(dst, "pn_delivery<%p>{%s, tag=b\"", obj, dir);
+  pn_fixed_string_quote(dst, bytes.start, bytes.size);
+  pn_fixed_string_addf(dst, "\", local=%s, remote=%s}",
+                       pn_disposition_type_name(d->local.type),
+                       pn_disposition_type_name(d->remote.type));
+  return;
 }
 
 pn_delivery_tag_t pn_dtag(const char *bytes, size_t size) {
diff --git a/c/src/core/event.c b/c/src/core/event.c
index 13eefdd41..5736b5c03 100644
--- a/c/src/core/event.c
+++ b/c/src/core/event.c
@@ -22,6 +22,7 @@
 #include <proton/object.h>
 #include <proton/event.h>
 
+#include "core/fixed_string.h"
 #include "core/object_private.h"
 
 #include <assert.h>
@@ -46,7 +47,7 @@ struct pn_event_t {
 
 static void pn_event_initialize(void *object);
 static void pn_event_finalize(void *object);
-static int pn_event_inspect(void *object, pn_string_t *string);
+static void pn_event_inspect(void *object, pn_fixed_string_t *string);
 #define pn_event_hashcode NULL
 #define pn_event_compare NULL
 
@@ -84,26 +85,25 @@ static void pn_collector_finalize(void *object)
   pn_decref(collector->pool);
 }
 
-static int pn_collector_inspect(void *object, pn_string_t *dst)
+static void pn_collector_inspect(void *object, pn_fixed_string_t *dst)
 {
   pn_collector_t *collector = (pn_collector_t *)object;
   assert(collector);
-  int err = pn_string_addf(dst, "EVENTS[");
-  if (err) return err;
+  pn_fixed_string_addf(dst, "EVENTS[");
   pn_event_t *event = collector->head;
   bool first = true;
   while (event) {
     if (first) {
       first = false;
     } else {
-      err = pn_string_addf(dst, ", ");
-      if (err) return err;
+      pn_fixed_string_addf(dst, ", ");
     }
-    err = pn_inspect(event, dst);
-    if (err) return err;
+
+      pn_finspect(event, dst);
     event = event->next;
   }
-  return pn_string_addf(dst, "]");
+  pn_fixed_string_addf(dst, "]");
+  return;
 }
 
 #define pn_collector_hashcode NULL
@@ -262,27 +262,24 @@ static void pn_event_finalize(void *object) {
   pn_decref(pool);
 }
 
-static int pn_event_inspect(void *object, pn_string_t *dst)
+static void pn_event_inspect(void *object, pn_fixed_string_t *dst)
 {
   pn_event_t *event = (pn_event_t *)object;
   assert(event);
   assert(dst);
   const char *name = pn_event_type_name(event->type);
-  int err;
   if (name) {
-    err = pn_string_addf(dst, "(%s", pn_event_type_name(event->type));
+    pn_fixed_string_addf(dst, "(%s", pn_event_type_name(event->type));
   } else {
-    err = pn_string_addf(dst, "(<%u>", (unsigned int) event->type);
+    pn_fixed_string_addf(dst, "(<%u>", (unsigned int) event->type);
   }
-  if (err) return err;
   if (event->context) {
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
-    err = pn_class_inspect(event->clazz, event->context, dst);
-    if (err) return err;
+    pn_fixed_string_addf(dst, ", ");
+    pn_class_inspect(event->clazz, event->context, dst);
   }
 
-  return pn_string_addf(dst, ")");
+  pn_fixed_string_addf(dst, ")");
+  return;
 }
 
 pn_event_t *pn_event(void)
diff --git a/c/src/core/fixed_string.h b/c/src/core/fixed_string.h
index fc36ee866..6df7be761 100644
--- a/c/src/core/fixed_string.h
+++ b/c/src/core/fixed_string.h
@@ -25,6 +25,9 @@
 #include "util.h"
 
 #include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
 
 typedef struct pn_fixed_string_t {
   char    *bytes;
diff --git a/c/src/core/message.c b/c/src/core/message.c
index 9f0d7e5c0..5a6849e15 100644
--- a/c/src/core/message.c
+++ b/c/src/core/message.c
@@ -27,6 +27,7 @@
 #include "protocol.h"
 #include "util.h"
 
+#include "core/fixed_string.h"
 #include "core/frame_generators.h"
 #include "core/frame_consumers.h"
 
@@ -157,216 +158,164 @@ void pn_message_finalize(void *obj)
   pn_error_free(msg->error);
 }
 
-int pn_message_inspect(void *obj, pn_string_t *dst)
+void pn_message_inspect(void *obj, pn_fixed_string_t *dst)
 {
   pn_message_t *msg = (pn_message_t *) obj;
-  int err = pn_string_addf(dst, "Message{");
-  if (err) return err;
+  pn_fixed_string_addf(dst, "Message{");
 
   bool comma = false;
 
   if (pn_string_get(msg->address)) {
-    err = pn_string_addf(dst, "address=");
-    if (err) return err;
-    err = pn_inspect(msg->address, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "address=");
+    pn_finspect(msg->address, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   if (msg->durable) {
-    err = pn_string_addf(dst, "durable=%i, ", msg->durable);
-    if (err) return err;
+    pn_fixed_string_addf(dst, "durable=%i, ", msg->durable);
     comma = true;
   }
 
   if (msg->priority != HEADER_PRIORITY_DEFAULT) {
-    err = pn_string_addf(dst, "priority=%i, ", msg->priority);
-    if (err) return err;
+    pn_fixed_string_addf(dst, "priority=%i, ", msg->priority);
     comma = true;
   }
 
   if (msg->ttl) {
-    err = pn_string_addf(dst, "ttl=%" PRIu32 ", ", msg->ttl);
-    if (err) return err;
+    pn_fixed_string_addf(dst, "ttl=%" PRIu32 ", ", msg->ttl);
     comma = true;
   }
 
   if (msg->first_acquirer) {
-    err = pn_string_addf(dst, "first_acquirer=%i, ", msg->first_acquirer);
-    if (err) return err;
+    pn_fixed_string_addf(dst, "first_acquirer=%i, ", msg->first_acquirer);
     comma = true;
   }
 
   if (msg->delivery_count) {
-    err = pn_string_addf(dst, "delivery_count=%" PRIu32 ", ", msg->delivery_count);
-    if (err) return err;
+    pn_fixed_string_addf(dst, "delivery_count=%" PRIu32 ", ", msg->delivery_count);
     comma = true;
   }
 
   pn_atom_t id = pn_message_get_id(msg);
   if (id.type!=PN_NULL) {
-    err = pn_string_addf(dst, "id=");
-    if (err) return err;
-    err = pni_inspect_atom(&id, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "id=");
+    pni_inspect_atom(&id, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   if (pn_string_get(msg->user_id)) {
-    err = pn_string_addf(dst, "user_id=");
-    if (err) return err;
-    err = pn_inspect(msg->user_id, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "user_id=");
+    pn_finspect(msg->user_id, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   if (pn_string_get(msg->subject)) {
-    err = pn_string_addf(dst, "subject=");
-    if (err) return err;
-    err = pn_inspect(msg->subject, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "subject=");
+    pn_finspect(msg->subject, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   if (pn_string_get(msg->reply_to)) {
-    err = pn_string_addf(dst, "reply_to=");
-    if (err) return err;
-    err = pn_inspect(msg->reply_to, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "reply_to=");
+    pn_finspect(msg->reply_to, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   pn_atom_t correlation_id = pn_message_get_correlation_id(msg);
   if (correlation_id.type!=PN_NULL) {
-    err = pn_string_addf(dst, "correlation_id=");
-    if (err) return err;
-    err = pni_inspect_atom(&correlation_id, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "correlation_id=");
+    pni_inspect_atom(&correlation_id, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   if (pn_string_get(msg->content_type)) {
-    err = pn_string_addf(dst, "content_type=");
-    if (err) return err;
-    err = pn_inspect(msg->content_type, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "content_type=");
+    pn_finspect(msg->content_type, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   if (pn_string_get(msg->content_encoding)) {
-    err = pn_string_addf(dst, "content_encoding=");
-    if (err) return err;
-    err = pn_inspect(msg->content_encoding, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "content_encoding=");
+    pn_finspect(msg->content_encoding, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   if (msg->expiry_time) {
-    err = pn_string_addf(dst, "expiry_time=%" PRIi64 ", ", msg->expiry_time);
-    if (err) return err;
+    pn_fixed_string_addf(dst, "expiry_time=%" PRIi64 ", ", msg->expiry_time);
     comma = true;
   }
 
   if (msg->creation_time) {
-    err = pn_string_addf(dst, "creation_time=%" PRIi64 ", ", msg->creation_time);
-    if (err) return err;
+    pn_fixed_string_addf(dst, "creation_time=%" PRIi64 ", ", msg->creation_time);
     comma = true;
   }
 
   if (pn_string_get(msg->group_id)) {
-    err = pn_string_addf(dst, "group_id=");
-    if (err) return err;
-    err = pn_inspect(msg->group_id, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "group_id=");
+    pn_finspect(msg->group_id, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   if (msg->group_sequence) {
-    err = pn_string_addf(dst, "group_sequence=%" PRIi32 ", ", msg->group_sequence);
-    if (err) return err;
+    pn_fixed_string_addf(dst, "group_sequence=%" PRIi32 ", ", msg->group_sequence);
     comma = true;
   }
 
   if (pn_string_get(msg->reply_to_group_id)) {
-    err = pn_string_addf(dst, "reply_to_group_id=");
-    if (err) return err;
-    err = pn_inspect(msg->reply_to_group_id, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "reply_to_group_id=");
+    pn_finspect(msg->reply_to_group_id, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   if (msg->inferred) {
-    err = pn_string_addf(dst, "inferred=%i, ", msg->inferred);
-    if (err) return err;
+    pn_fixed_string_addf(dst, "inferred=%i, ", msg->inferred);
     comma = true;
   }
 
   if (pn_data_size(msg->instructions)) {
-    err = pn_string_addf(dst, "instructions=");
-    if (err) return err;
-    err = pn_inspect(msg->instructions, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "instructions=");
+    pn_finspect(msg->instructions, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   if (pn_data_size(msg->annotations)) {
-    err = pn_string_addf(dst, "annotations=");
-    if (err) return err;
-    err = pn_inspect(msg->annotations, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "annotations=");
+    pn_finspect(msg->annotations, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   if (pn_data_size(msg->properties)) {
-    err = pn_string_addf(dst, "properties=");
-    if (err) return err;
-    err = pn_inspect(msg->properties, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "properties=");
+    pn_finspect(msg->properties, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   if (pn_data_size(msg->body)) {
-    err = pn_string_addf(dst, "body=");
-    if (err) return err;
-    err = pn_inspect(msg->body, dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ", ");
-    if (err) return err;
+    pn_fixed_string_addf(dst, "body=");
+    pn_finspect(msg->body, dst);
+    pn_fixed_string_addf(dst, ", ");
     comma = true;
   }
 
   if (comma) {
-    int err = pn_string_resize(dst, pn_string_size(dst) - 2);
-    if (err) return err;
-  }
+    dst->position = dst->position - 2;
+ }
 
-  return pn_string_addf(dst, "}");
+  pn_fixed_string_addf(dst, "}");
+  return;
 }
 
 #define pn_message_initialize NULL
diff --git a/c/src/core/object/list.c b/c/src/core/object/list.c
index 3d2bc0f6e..72fd799fd 100644
--- a/c/src/core/object/list.c
+++ b/c/src/core/object/list.c
@@ -19,8 +19,7 @@
  *
  */
 
-#include <proton/object.h>
-
+#include "core/fixed_string.h"
 #include "core/memory.h"
 
 #include <stddef.h>
@@ -236,22 +235,20 @@ static intptr_t pn_list_compare(void *oa, void *ob)
   return 0;
 }
 
-static int pn_list_inspect(void *obj, pn_string_t *dst)
+static void pn_list_inspect(void *obj, pn_fixed_string_t *dst)
 {
   assert(obj);
   pn_list_t *list = (pn_list_t *) obj;
-  int err = pn_string_addf(dst, "[");
-  if (err) return err;
+  pn_fixed_string_addf(dst, "[");
   size_t n = pn_list_size(list);
   for (size_t i = 0; i < n; i++) {
     if (i > 0) {
-      err = pn_string_addf(dst, ", ");
-      if (err) return err;
+      pn_fixed_string_addf(dst, ", ");
     }
-    err = pn_class_inspect(list->clazz, pn_list_get(list, i), dst);
-    if (err) return err;
+    pn_class_inspect(list->clazz, pn_list_get(list, i), dst);
   }
-  return pn_string_addf(dst, "]");
+  pn_fixed_string_addf(dst, "]");
+  return;
 }
 
 #define pn_list_initialize NULL
diff --git a/c/src/core/object/map.c b/c/src/core/object/map.c
index 9ee154c8f..faf4b9ada 100644
--- a/c/src/core/object/map.c
+++ b/c/src/core/object/map.c
@@ -19,9 +19,8 @@
  *
  */
 
-#include <proton/object.h>
-
 #include "core/memory.h"
+#include "core/fixed_string.h"
 
 #include <stddef.h>
 #include <assert.h>
@@ -94,30 +93,26 @@ static void pni_map_allocate(pn_map_t *map)
   map->size = 0;
 }
 
-static int pn_map_inspect(void *obj, pn_string_t *dst)
+static void pn_map_inspect(void *obj, pn_fixed_string_t *dst)
 {
   assert(obj);
   pn_map_t *map = (pn_map_t *) obj;
-  int err = pn_string_addf(dst, "{");
-  if (err) return err;
+  pn_fixed_string_addf(dst, "{");
   pn_handle_t entry = pn_map_head(map);
   bool first = true;
   while (entry) {
     if (first) {
       first = false;
     } else {
-      err = pn_string_addf(dst, ", ");
-      if (err) return err;
+      pn_fixed_string_addf(dst, ", ");
     }
-    err = pn_class_inspect(map->key, pn_map_key(map, entry), dst);
-    if (err) return err;
-    err = pn_string_addf(dst, ": ");
-    if (err) return err;
-    err = pn_class_inspect(map->value, pn_map_value(map, entry), dst);
-    if (err) return err;
+    pn_class_inspect(map->key, pn_map_key(map, entry), dst);
+    pn_fixed_string_addf(dst, ": ");
+    pn_class_inspect(map->value, pn_map_value(map, entry), dst);
     entry = pn_map_next(map, entry);
   }
-  return pn_string_addf(dst, "}");
+  pn_fixed_string_addf(dst, "}");
+  return;
 }
 
 #define pn_map_initialize NULL
diff --git a/c/src/core/object/object.c b/c/src/core/object/object.c
index 2b2eadf23..2db97c907 100644
--- a/c/src/core/object/object.c
+++ b/c/src/core/object/object.c
@@ -22,6 +22,8 @@
 #include <proton/object.h>
 
 #include "core/memory.h"
+#include "core/fixed_string.h"
+#include "core/object_private.h"
 
 #include <assert.h>
 #include <stdlib.h>
@@ -252,19 +254,17 @@ bool pn_class_equals(const pn_class_t *clazz, void *a, void *b)
   return pn_class_compare(clazz, a, b) == 0;
 }
 
-int pn_class_inspect(const pn_class_t *clazz, void *object, pn_string_t *dst)
+void pn_class_inspect(const pn_class_t *clazz, void *object, pn_fixed_string_t *dst)
 {
-  if (!pn_string_get(dst)) {
-    pn_string_set(dst, "");
-  }
-
   if (object && clazz->inspect) {
-    return clazz->inspect(object, dst);
+    clazz->inspect(object, dst);
+    return;
   }
 
   const char *name = clazz->name ? clazz->name : "<anon>";
 
-  return pn_string_addf(dst, "%s<%p>", name, object);
+  pn_fixed_string_addf(dst, "%s<%p>", name, object);
+  return;
 }
 
 void *pn_incref(void *object)
@@ -384,23 +384,45 @@ int pn_inspect(void *object, pn_string_t *dst)
   const pn_class_t *clazz = pni_head(object)->clazz;
 
   if (clazz->inspect) {
-    return clazz->inspect(object, dst);
+    char buf[1024];
+    pn_fixed_string_t str = pn_fixed_string(buf, sizeof(buf));
+    clazz->inspect(object, &str);
+    return pn_string_setn(dst, buf, str.position);
   }
 
   const char *name = clazz->name ? clazz->name : "<anon>";
   return pn_string_addf(dst, "%s<%p>", name, object);
 }
 
+void pn_finspect(void *object, pn_fixed_string_t *dst)
+{
+  if (!object) {
+    pn_fixed_string_addf(dst, "pn_object<%p>", object);
+    return;
+  }
+
+  const pn_class_t *clazz = pni_head(object)->clazz;
+
+  if (clazz->inspect) {
+    clazz->inspect(object, dst);
+    return;
+  }
+
+  const char *name = clazz->name ? clazz->name : "<anon>";
+  pn_fixed_string_addf(dst, "%s<%p>", name, object);
+  return;
+}
+
 char *pn_tostring(void *object)
 {
-  pn_string_t *s = pn_string(NULL);
-  pn_inspect(object, s);
+  char buf[1024];
+  pn_fixed_string_t s = pn_fixed_string(buf, sizeof(buf));
+  pn_finspect(object, &s);
+  pn_fixed_string_terminate(&s);
 
-  const char *sc = pn_string_get(s);
-  int l = pn_string_size(s)+1; // include final null
+  int l = s.position+1; // include final null
   char *r = malloc(l);
-  strncpy(r, sc, l);
-  pn_decref(s);
+  strncpy(r, buf, l);
   return r;
 }
 
@@ -415,7 +437,7 @@ char *pn_tostring(void *object)
 
 #define pn_weakref_hashcode pn_hashcode
 #define pn_weakref_compare pn_compare
-#define pn_weakref_inspect pn_inspect
+#define pn_weakref_inspect pn_finspect
 
 const pn_class_t PN_WEAKREF[] = {PN_METACLASS(pn_weakref)};
 
@@ -460,7 +482,7 @@ int pn_strongref_refcount(void *object)
 
 #define pn_strongref_hashcode pn_hashcode
 #define pn_strongref_compare pn_compare
-#define pn_strongref_inspect pn_inspect
+#define pn_strongref_inspect pn_finspect
 
 static const pn_class_t PN_OBJECT_S = PN_METACLASS(pn_strongref);
 const pn_class_t *PN_OBJECT = &PN_OBJECT_S;
diff --git a/c/src/core/object/string.c b/c/src/core/object/string.c
index b50530674..efcb642f3 100644
--- a/c/src/core/object/string.c
+++ b/c/src/core/object/string.c
@@ -23,6 +23,7 @@
 #include <proton/error.h>
 #include <proton/object.h>
 
+#include "core/fixed_string.h"
 #include "core/memory.h"
 
 #include <stdio.h>
@@ -74,28 +75,27 @@ static intptr_t pn_string_compare(void *oa, void *ob)
   }
 }
 
-static int pn_string_inspect(void *obj, pn_string_t *dst)
+static void pn_string_inspect(void *obj, pn_fixed_string_t *dst)
 {
   pn_string_t *str = (pn_string_t *) obj;
   if (str->size == PNI_NULL_SIZE) {
-    return pn_string_addf(dst, "null");
+    pn_fixed_string_addf(dst, "null");
+    return;
   }
 
-  int err = pn_string_addf(dst, "\"");
-  if (err) return err;
+  pn_fixed_string_addf(dst, "\"");
 
   for (int i = 0; i < str->size; i++) {
     uint8_t c = str->bytes[i];
     if (isprint(c)) {
-      err = pn_string_addf(dst, "%c", c);
-      if (err) return err;
+      pn_fixed_string_addf(dst, "%c", c);
     } else {
-      err = pn_string_addf(dst, "\\x%.2x", c);
-      if (err) return err;
+      pn_fixed_string_addf(dst, "\\x%.2x", c);
     }
   }
 
-  return pn_string_addf(dst, "\"");
+  pn_fixed_string_addf(dst, "\"");
+  return;
 }
 
 pn_string_t *pn_string(const char *bytes)
diff --git a/c/src/core/object_private.h b/c/src/core/object_private.h
index 9b277c28a..12a784506 100644
--- a/c/src/core/object_private.h
+++ b/c/src/core/object_private.h
@@ -47,6 +47,7 @@ typedef struct pn_hash_t pn_hash_t;
 typedef void *(*pn_iterator_next_t)(void *state);
 typedef struct pn_iterator_t pn_iterator_t;
 
+struct pn_fixed_string_t;
 struct pn_class_t {
     const char *name;
     pn_cid_t cid;
@@ -59,7 +60,7 @@ struct pn_class_t {
     void (*free)(void *);
     uintptr_t (*hashcode)(void *);
     intptr_t (*compare)(void *, void *);
-    int (*inspect)(void *, pn_string_t *);
+    void (*inspect)(void *, struct pn_fixed_string_t*);
 };
 
 #define PN_CLASS(PREFIX) {                      \
@@ -124,7 +125,7 @@ PN_EXTERN void pn_class_free(const pn_class_t *clazz, void *object);
 
 PN_EXTERN intptr_t pn_class_compare(const pn_class_t *clazz, void *a, void *b);
 PN_EXTERN bool pn_class_equals(const pn_class_t *clazz, void *a, void *b);
-PN_EXTERN int pn_class_inspect(const pn_class_t *clazz, void *object, pn_string_t *dst);
+PN_EXTERN void pn_class_inspect(const pn_class_t *clazz, void *object, struct pn_fixed_string_t *dst);
 
 PN_EXTERN void pn_object_incref(void *object);
 
@@ -133,6 +134,7 @@ PN_EXTERN void pn_void_incref(void *object);
 PN_EXTERN void pn_void_decref(void *object);
 PN_EXTERN int pn_void_refcount(void *object);
 
+void pn_finspect(void *object, struct pn_fixed_string_t *dst);
 PN_EXTERN int pn_inspect(void *object, pn_string_t *dst);
 PN_EXTERN uintptr_t pn_hashcode(void *object);
 PN_EXTERN intptr_t pn_compare(void *a, void *b);
diff --git a/c/src/core/util.h b/c/src/core/util.h
index 7895f9e84..692f8fdb6 100644
--- a/c/src/core/util.h
+++ b/c/src/core/util.h
@@ -32,14 +32,16 @@
 #include <stdlib.h>
 #include <string.h>
 #include <proton/types.h>
-#include <proton/object.h>
+
+#include "object_private.h"
 
 #if __cplusplus
 extern "C" {
 #endif
 
 ssize_t pn_quote_data(char *dst, size_t capacity, const char *src, size_t size);
-int pn_quote(pn_string_t *dst, const char *src, size_t size);
+struct pn_string_t;
+int pn_quote(struct pn_string_t *dst, const char *src, size_t size);
 bool pn_env_bool(const char *name);
 pn_timestamp_t pn_timestamp_min(pn_timestamp_t a, pn_timestamp_t b);
 
@@ -54,7 +56,7 @@ static inline bool pn_bytes_equal(const pn_bytes_t a, const pn_bytes_t b) {
   return (a.size == b.size && !memcmp(a.start, b.start, a.size));
 }
 
-static inline pn_bytes_t pn_string_bytes(pn_string_t *s) {
+static inline pn_bytes_t pn_string_bytes(struct pn_string_t *s) {
   return pn_bytes(pn_string_size(s), pn_string_get(s));
 }
 
diff --git a/c/src/core/value_dump.h b/c/src/core/value_dump.h
index 3da41249c..0f6418f5a 100644
--- a/c/src/core/value_dump.h
+++ b/c/src/core/value_dump.h
@@ -24,8 +24,6 @@
 
 #include "proton/types.h"
 
-#include "core/object_private.h"
-
 struct pn_fixed_string_t;
 size_t pni_value_dump(pn_bytes_t frame, struct pn_fixed_string_t *output);
 
diff --git a/c/src/extra/url.c b/c/src/extra/url.c
index 9652f82a2..5e71b6234 100644
--- a/c/src/extra/url.c
+++ b/c/src/extra/url.c
@@ -21,6 +21,7 @@
 
 #define PN_USE_DEPRECATED_API 1
 
+#include "core/fixed_string.h"
 #include "core/util.h"
 #include "proton/url.h"
 #include "proton/object.h"
@@ -176,13 +177,13 @@ static intptr_t pn_url_compare(void *oa, void *ob)
 }
 
 
-static int pn_url_inspect(void *obj, pn_string_t *dst)
+static void pn_url_inspect(void *obj, pn_fixed_string_t *dst)
 {
     pn_url_t *url = (pn_url_t *) obj;
-    int err = 0;
-    err = pn_string_addf(dst, "Url("); if (err) return err;
-    err = pn_inspect(pn_url_string(url), dst); if (err) return err;
-    return pn_string_addf(dst, ")");
+    pn_fixed_string_addf(dst, "Url(");
+    pn_finspect(pn_url_string(url), dst);
+    pn_fixed_string_addf(dst, ")");
+    return;
 }
 
 #define pn_url_initialize NULL
diff --git a/c/src/reactor/reactor.c b/c/src/reactor/reactor.c
index dbb9e8e26..340ee7c6b 100644
--- a/c/src/reactor/reactor.c
+++ b/c/src/reactor/reactor.c
@@ -19,6 +19,7 @@
  *
  */
 
+#include "core/fixed_string.h"
 #include "core/object_private.h"
 #include "io.h"
 #include "reactor.h"
@@ -364,10 +365,11 @@ pn_task_t *pn_reactor_schedule(pn_reactor_t *reactor, int delay, pn_handler_t *h
 }
 
 void pni_event_print(pn_event_t *event) {
-  pn_string_t *str = pn_string(NULL);
-  pn_inspect(event, str);
-  printf("%s\n", pn_string_get(str));
-  pn_free(str);
+  char buf[256];
+  pn_fixed_string_t str = pn_fixed_string(buf, sizeof(buf));
+  pn_finspect(event, &str);
+  pn_fixed_string_terminate(&str);
+  printf("%s\n", buf);
 }
 
 bool pni_reactor_more(pn_reactor_t *reactor) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org