You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2018/09/27 18:52:16 UTC
[2/3] qpid-proton git commit: PROTON-1942: [c] separate
pn_message_encode2 from pn_message_send
PROTON-1942: [c] separate pn_message_encode2 from pn_message_send
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/b429db0f
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/b429db0f
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/b429db0f
Branch: refs/heads/master
Commit: b429db0f70f5b37c907224d6c7ee0f2a698fd6e9
Parents: 77c6354
Author: Alan Conway <ac...@redhat.com>
Authored: Thu Sep 27 13:17:32 2018 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Thu Sep 27 14:07:55 2018 -0400
----------------------------------------------------------------------
c/include/proton/message.h | 34 ++++++++++++++++++++--------------
c/src/core/message.c | 25 ++++++++++++++++---------
2 files changed, 36 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b429db0f/c/include/proton/message.h
----------------------------------------------------------------------
diff --git a/c/include/proton/message.h b/c/include/proton/message.h
index 9340d03..41c37af 100644
--- a/c/include/proton/message.h
+++ b/c/include/proton/message.h
@@ -737,6 +737,20 @@ PN_EXTERN int pn_message_decode(pn_message_t *msg, const char *bytes, size_t siz
*/
PN_EXTERN int pn_message_encode(pn_message_t *msg, char *bytes, size_t *size);
+/**
+ * **Unsettled API**: Encode a message, allocating space if necessary
+ *
+ * @param[in] msg A message object.
+ * @param[inout] buf Used to encode msg.
+ * If buf->start == NULL memory is allocated with malloc().
+ * If buf->size is not large enough, buffer is expanded with realloc().
+ * On return buf holds the address and size of the final buffer.
+ * buf->size may be larger than the length of the encoded message.
+ * @return The length of the encoded message or an error code (<0).
+ * On error pn_message_error(msg) will provide more information.
+ */
+PN_EXTERN ssize_t pn_message_encode2(pn_message_t *msg, pn_rwbytes_t *buf);
+
struct pn_link_t;
/**
@@ -745,8 +759,7 @@ struct pn_link_t;
* Encode and send a message on a sender link.
*
* Performs the following steps:
- * - create or expand the buffer @p buf as required
- * - call pn_message_encode() to encode the message to a buffer
+ * - call pn_message_encode2() to encode the message to a buffer
* - call pn_link_send() to send the encoded message bytes
* - call pn_link_advance() to indicate the message is complete
*
@@ -755,18 +768,11 @@ struct pn_link_t;
*
* @param[in] msg A message object.
* @param[in] sender A sending link.
- * The message will be encoded and sent with pn_link_send()
- * @param[inout] buf Used to encode the message.
- * - if buf == NULL, temporary space will be allocated and freed with malloc()/free()
- * - if buf->start != NULL and buf->size is large enough, the message is encoded to
- * buf->start
- * - if buf->start == NULL or buf->size is not enough, the buffer will be extended like this:
- *
- * buf->size = new_size; buf->start = realloc(buf->start, new_size)
- *
- * it is possible for the buffer to be extended more than once.
- * @return The number of bytes encoded and sent on success.
- * Returns an error code (< 0) on failure and sets pn_message_error() on msg
+ * @param[inout] buf See pn_message_encode2. If buf == NULL then
+ * any memory needed for encoding will be allocated and freed by pn_message_send().
+ *
+ * @return The length of the encoded message or an error code (<0).
+ * On error pn_message_error(msg) will provide more information.
*/
PN_EXTERN ssize_t pn_message_send(pn_message_t *msg, pn_link_t *sender, pn_rwbytes_t *buf);
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b429db0f/c/src/core/message.c
----------------------------------------------------------------------
diff --git a/c/src/core/message.c b/c/src/core/message.c
index dbbdacf..41ccd08 100644
--- a/c/src/core/message.c
+++ b/c/src/core/message.c
@@ -897,13 +897,11 @@ pn_data_t *pn_message_body(pn_message_t *msg)
return msg ? msg->body : NULL;
}
-PN_EXTERN ssize_t pn_message_send(pn_message_t *msg, pn_link_t *sender, pn_rwbytes_t *buffer) {
+ssize_t pn_message_encode2(pn_message_t *msg, pn_rwbytes_t *buffer) {
static const size_t initial_size = 256;
- pn_rwbytes_t local_buf = { 0 };
- ssize_t err = 0;
+ int err = 0;
size_t size = 0;
- if (buffer == NULL) buffer = &local_buf;
if (buffer->start == NULL) {
buffer->start = (char*)malloc(initial_size);
buffer->size = initial_size;
@@ -916,9 +914,18 @@ PN_EXTERN ssize_t pn_message_send(pn_message_t *msg, pn_link_t *sender, pn_rwbyt
if (buffer->start == NULL) return PN_OUT_OF_MEMORY;
size = buffer->size;
}
- if (err >= 0) err = pn_link_send(sender, buffer->start, size);
- if (err >= 0) err = pn_link_advance(sender);
- if (err < 0) pn_error_copy(pn_message_error(msg), pn_link_error(sender));
- free(local_buf.start);
- return err;
+ return err == 0 ? (ssize_t)size : err;
+}
+
+ssize_t pn_message_send(pn_message_t *msg, pn_link_t *sender, pn_rwbytes_t *buffer) {
+ pn_rwbytes_t local_buf = { 0 };
+ if (!buffer) buffer = &local_buf;
+ ssize_t ret = pn_message_encode2(msg, buffer);
+ if (ret >= 0) {
+ ret = pn_link_send(sender, buffer->start, ret);
+ if (ret >= 0) ret = pn_link_advance(sender);
+ if (ret < 0) pn_error_copy(pn_message_error(msg), pn_link_error(sender));
+ }
+ if (local_buf.start) free(local_buf.start);
+ return ret;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org