You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kg...@apache.org on 2015/03/10 13:20:57 UTC
svn commit: r1665503 - in /qpid/dispatch/trunk:
include/qpid/dispatch/iterator.h src/container.c src/iterator.c src/lrp.c
src/message.c src/router_config.c src/router_node.c src/router_pynode.c
src/waypoint.c tests/field_test.c tests/parse_test.c
Author: kgiusti
Date: Tue Mar 10 12:20:57 2015
New Revision: 1665503
URL: http://svn.apache.org/r1665503
Log:
DISPATCH-101: rename those iterator methods that are specific to address handling
Modified:
qpid/dispatch/trunk/include/qpid/dispatch/iterator.h
qpid/dispatch/trunk/src/container.c
qpid/dispatch/trunk/src/iterator.c
qpid/dispatch/trunk/src/lrp.c
qpid/dispatch/trunk/src/message.c
qpid/dispatch/trunk/src/router_config.c
qpid/dispatch/trunk/src/router_node.c
qpid/dispatch/trunk/src/router_pynode.c
qpid/dispatch/trunk/src/waypoint.c
qpid/dispatch/trunk/tests/field_test.c
qpid/dispatch/trunk/tests/parse_test.c
Modified: qpid/dispatch/trunk/include/qpid/dispatch/iterator.h
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/include/qpid/dispatch/iterator.h?rev=1665503&r1=1665502&r2=1665503&view=diff
==============================================================================
--- qpid/dispatch/trunk/include/qpid/dispatch/iterator.h (original)
+++ qpid/dispatch/trunk/include/qpid/dispatch/iterator.h Tue Mar 10 12:20:57 2015
@@ -110,19 +110,28 @@ typedef enum {
* The "text" string must stay intact for the whole life of the iterator. The iterator
* does not copy the string, it references it.
*/
-qd_field_iterator_t* qd_field_iterator_string(const char *text,
- qd_iterator_view_t view);
+qd_field_iterator_t* qd_address_iterator_string(const char *text,
+ qd_iterator_view_t view);
+static inline qd_field_iterator_t* qd_field_iterator_string(const char *text)
+{
+ return qd_address_iterator_string(text, ITER_VIEW_ALL);
+}
/**
- * Create an iterator from binar data.
+ * Create an iterator from binary data.
*
* The "text" string must stay intact for the whole life of the iterator. The iterator
* does not copy the data, it references it.
*/
-qd_field_iterator_t* qd_field_iterator_binary(const char *text,
- int length,
- qd_iterator_view_t view);
+qd_field_iterator_t* qd_address_iterator_binary(const char *text,
+ int length,
+ qd_iterator_view_t view);
+static inline qd_field_iterator_t *qd_field_iterator_binary(const char *text,
+ int length)
+{
+ return qd_address_iterator_binary(text, length, ITER_VIEW_ALL);
+}
/**
@@ -131,10 +140,16 @@ qd_field_iterator_t* qd_field_iterator_b
* The buffer chain must stay intact for the whole life of the iterator. The iterator
* does not copy the buffer, it references it.
*/
-qd_field_iterator_t *qd_field_iterator_buffer(qd_buffer_t *buffer,
- int offset,
- int length,
- qd_iterator_view_t view);
+qd_field_iterator_t *qd_address_iterator_buffer(qd_buffer_t *buffer,
+ int offset,
+ int length,
+ qd_iterator_view_t view);
+static inline qd_field_iterator_t *qd_field_iterator_buffer(qd_buffer_t *buffer,
+ int offset,
+ int length)
+{
+ return qd_address_iterator_buffer(buffer, offset, length, ITER_VIEW_ALL);
+}
/**
* Free an iterator
@@ -152,15 +167,15 @@ void qd_field_iterator_set_address(const
*/
void qd_field_iterator_reset(qd_field_iterator_t *iter);
-void qd_field_iterator_reset_view(qd_field_iterator_t *iter,
+void qd_address_iterator_reset_view(qd_field_iterator_t *iter,
qd_iterator_view_t view);
-void qd_field_iterator_set_phase(qd_field_iterator_t *iter, char phase);
+void qd_address_iterator_set_phase(qd_field_iterator_t *iter, char phase);
/**
* Override the hash-prefix with a custom character.
*/
-void qd_field_iterator_override_prefix(qd_field_iterator_t *iter, char prefix);
+void qd_address_iterator_override_prefix(qd_field_iterator_t *iter, char prefix);
/**
* Return the current octet in the iterator's view and step to the next.
@@ -170,14 +185,17 @@ unsigned char qd_field_iterator_octet(qd
/**
* Return true iff the iterator has no more octets in the view.
*/
-int qd_field_iterator_end(qd_field_iterator_t *iter);
+int qd_field_iterator_end(const qd_field_iterator_t *iter);
/**
* Return a sub-iterator that equals the supplied iterator except that it
* starts at the supplied iterator's current position.
*/
-qd_field_iterator_t *qd_field_iterator_sub(qd_field_iterator_t *iter, uint32_t length);
+qd_field_iterator_t *qd_field_iterator_sub(const qd_field_iterator_t *iter, uint32_t length);
+/**
+ * Move the iterator's cursor forward up to length bytes
+ */
void qd_field_iterator_advance(qd_field_iterator_t *iter, uint32_t length);
/**
@@ -190,7 +208,7 @@ void qd_field_iterator_advance(qd_field_
* @param iter A field iterator
* @return The number of octets remaining in the view (or more)
*/
-uint32_t qd_field_iterator_remaining(qd_field_iterator_t *iter);
+uint32_t qd_field_iterator_remaining(const qd_field_iterator_t *iter);
/**
* Compare an input string to the iterator's view. Return true iff they are equal.
@@ -208,24 +226,26 @@ int qd_field_iterator_prefix(qd_field_it
/**
* Return the exact length of the iterator's view.
*/
-int qd_field_iterator_length(qd_field_iterator_t *iter);
+int qd_field_iterator_length(const qd_field_iterator_t *iter);
/**
- * Copy the iterator's view into buffer up to a maximum of n bytes.
- * There is no trailing '\0' added.
+ * Copy the iterator's view into buffer up to a maximum of n bytes. Cursor is
+ * advanced by the number of bytes copied. There is no trailing '\0' added.
* @return number of bytes copied.
*/
int qd_field_iterator_ncopy(qd_field_iterator_t *iter, unsigned char* buffer, int n);
/**
- * Return a new copy of the iterator's view, with a trailing '\0' added.
+ * Return a new copy of the iterator's view, with a trailing '\0' added. The
+ * cursor is advanced to the end of the view.
* @return Copy of the view, free with free()
*/
unsigned char *qd_field_iterator_copy(qd_field_iterator_t *iter);
/**
* Copy the iterator's view into buffer as a null terminated string,
- * up to a maximum of n bytes. Useful for log messages.
+ * up to a maximum of n bytes. Cursor is advanced by the number of bytes
+ * copied. Useful for log messages.
* @return buffer.
*/
char* qd_field_iterator_strncpy(qd_field_iterator_t *iter, char* buffer, int n);
Modified: qpid/dispatch/trunk/src/container.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/container.c?rev=1665503&r1=1665502&r2=1665503&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/container.c (original)
+++ qpid/dispatch/trunk/src/container.c Tue Mar 10 12:20:57 2015
@@ -103,7 +103,7 @@ static void setup_outgoing_link(qd_conta
// TODO - Extract the name from the structured source
if (source) {
- iter = qd_field_iterator_string(source, ITER_VIEW_NODE_ID);
+ iter = qd_address_iterator_string(source, ITER_VIEW_NODE_ID);
qd_hash_retrieve(container->node_map, iter, (void*) &node);
qd_field_iterator_free(iter);
}
@@ -148,7 +148,7 @@ static void setup_incoming_link(qd_conta
// TODO - Extract the name from the structured target
if (target) {
- iter = qd_field_iterator_string(target, ITER_VIEW_NODE_ID);
+ iter = qd_address_iterator_string(target, ITER_VIEW_NODE_ID);
qd_hash_retrieve(container->node_map, iter, (void*) &node);
qd_field_iterator_free(iter);
}
@@ -538,7 +538,7 @@ int qd_container_register_node_type(qd_d
qd_container_t *container = qd->container;
int result;
- qd_field_iterator_t *iter = qd_field_iterator_string(nt->type_name, ITER_VIEW_ALL);
+ qd_field_iterator_t *iter = qd_field_iterator_string(nt->type_name);
qdc_node_type_t *nt_item = NEW(qdc_node_type_t);
DEQ_ITEM_INIT(nt_item);
nt_item->ntype = nt;
@@ -601,7 +601,7 @@ qd_node_t *qd_container_create_node(qd_d
node->life_policy = life_policy;
if (name) {
- qd_field_iterator_t *iter = qd_field_iterator_string(name, ITER_VIEW_ALL);
+ qd_field_iterator_t *iter = qd_field_iterator_string(name);
sys_mutex_lock(container->lock);
result = qd_hash_insert(container->node_map, iter, node, 0);
if (result >= 0)
@@ -629,7 +629,7 @@ void qd_container_destroy_node(qd_node_t
qd_container_t *container = node->container;
if (node->name) {
- qd_field_iterator_t *iter = qd_field_iterator_string(node->name, ITER_VIEW_ALL);
+ qd_field_iterator_t *iter = qd_field_iterator_string(node->name);
sys_mutex_lock(container->lock);
qd_hash_remove(container->node_map, iter);
DEQ_REMOVE(container->nodes, node);
Modified: qpid/dispatch/trunk/src/iterator.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/iterator.c?rev=1665503&r1=1665502&r2=1665503&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/iterator.c (original)
+++ qpid/dispatch/trunk/src/iterator.c Tue Mar 10 12:20:57 2015
@@ -76,6 +76,7 @@ static char *my_area = "";
static char *my_router = "";
+
static void parse_address_view(qd_field_iterator_t *iter)
{
//
@@ -259,6 +260,40 @@ static void view_initialize(qd_field_ite
}
+static inline void field_iterator_move_cursor(qd_field_iterator_t *iter, uint32_t length)
+{
+ // Only safe to call this help method if the cursor is parsing the data,
+ // i.e. if iter is an address iterator, the cursor must be 'past' the
+ // prefix
+ assert(iter->state == STATE_IN_ADDRESS);
+ uint32_t count = ((length > iter->pointer.length)
+ ? iter->pointer.length
+ : length);
+
+ if (iter->pointer.buffer) {
+ while (count) {
+ uint32_t remaining = qd_buffer_cursor(iter->pointer.buffer) - iter->pointer.cursor;
+ remaining = (remaining > count) ? count : remaining;
+ iter->pointer.cursor += remaining;
+ iter->pointer.length -= remaining;
+ count -= remaining;
+ if (iter->pointer.cursor == qd_buffer_cursor(iter->pointer.buffer)) {
+ iter->pointer.buffer = iter->pointer.buffer->next;
+ if (iter->pointer.buffer == 0) {
+ iter->pointer.length = 0;
+ iter->pointer.cursor = 0;
+ break;
+ } else {
+ iter->pointer.cursor = qd_buffer_base(iter->pointer.buffer);
+ }
+ }
+ }
+ } else { // string/binary data
+ iter->pointer.cursor += count;
+ iter->pointer.length -= count;
+ }
+}
+
void qd_field_iterator_set_address(const char *area, const char *router)
{
my_area = (char*) malloc(strlen(area) + 2);
@@ -271,7 +306,7 @@ void qd_field_iterator_set_address(const
}
-qd_field_iterator_t* qd_field_iterator_string(const char *text, qd_iterator_view_t view)
+qd_field_iterator_t* qd_address_iterator_string(const char *text, qd_iterator_view_t view)
{
qd_field_iterator_t *iter = new_qd_field_iterator_t();
if (!iter)
@@ -283,13 +318,13 @@ qd_field_iterator_t* qd_field_iterator_s
iter->phase = '0';
iter->prefix_override = '\0';
- qd_field_iterator_reset_view(iter, view);
+ qd_address_iterator_reset_view(iter, view);
return iter;
}
-qd_field_iterator_t* qd_field_iterator_binary(const char *text, int length, qd_iterator_view_t view)
+qd_field_iterator_t* qd_address_iterator_binary(const char *text, int length, qd_iterator_view_t view)
{
qd_field_iterator_t *iter = new_qd_field_iterator_t();
if (!iter)
@@ -301,13 +336,13 @@ qd_field_iterator_t* qd_field_iterator_b
iter->phase = '0';
iter->prefix_override = '\0';
- qd_field_iterator_reset_view(iter, view);
+ qd_address_iterator_reset_view(iter, view);
return iter;
}
-qd_field_iterator_t *qd_field_iterator_buffer(qd_buffer_t *buffer, int offset, int length, qd_iterator_view_t view)
+qd_field_iterator_t *qd_address_iterator_buffer(qd_buffer_t *buffer, int offset, int length, qd_iterator_view_t view)
{
qd_field_iterator_t *iter = new_qd_field_iterator_t();
if (!iter)
@@ -319,7 +354,7 @@ qd_field_iterator_t *qd_field_iterator_b
iter->phase = '0';
iter->prefix_override = '\0';
- qd_field_iterator_reset_view(iter, view);
+ qd_address_iterator_reset_view(iter, view);
return iter;
}
@@ -339,7 +374,7 @@ void qd_field_iterator_reset(qd_field_it
}
-void qd_field_iterator_reset_view(qd_field_iterator_t *iter, qd_iterator_view_t view)
+void qd_address_iterator_reset_view(qd_field_iterator_t *iter, qd_iterator_view_t view)
{
iter->pointer = iter->start_pointer;
iter->view = view;
@@ -350,16 +385,16 @@ void qd_field_iterator_reset_view(qd_fie
}
-void qd_field_iterator_set_phase(qd_field_iterator_t *iter, char phase)
+void qd_address_iterator_set_phase(qd_field_iterator_t *iter, char phase)
{
iter->phase = phase;
}
-void qd_field_iterator_override_prefix(qd_field_iterator_t *iter, char prefix)
+void qd_address_iterator_override_prefix(qd_field_iterator_t *iter, char prefix)
{
iter->prefix_override = prefix;
- qd_field_iterator_reset_view(iter, iter->view);
+ qd_address_iterator_reset_view(iter, iter->view);
}
@@ -380,20 +415,7 @@ unsigned char qd_field_iterator_octet(qd
unsigned char result = *(iter->pointer.cursor);
- iter->pointer.cursor++;
- iter->pointer.length--;
-
- if (iter->pointer.length > 0) {
- if (iter->pointer.buffer) {
- if (iter->pointer.cursor - qd_buffer_base(iter->pointer.buffer) == qd_buffer_size(iter->pointer.buffer)) {
- iter->pointer.buffer = iter->pointer.buffer->next;
- if (iter->pointer.buffer == 0)
- iter->pointer.length = 0;
- iter->pointer.cursor = qd_buffer_base(iter->pointer.buffer);
- }
- }
- }
-
+ field_iterator_move_cursor(iter, 1);
if (iter->pointer.length && iter->mode == MODE_TO_SLASH && *(iter->pointer.cursor) == '/')
iter->pointer.length = 0;
@@ -401,13 +423,13 @@ unsigned char qd_field_iterator_octet(qd
}
-int qd_field_iterator_end(qd_field_iterator_t *iter)
+int qd_field_iterator_end(const qd_field_iterator_t *iter)
{
return iter->pointer.length == 0;
}
-qd_field_iterator_t *qd_field_iterator_sub(qd_field_iterator_t *iter, uint32_t length)
+qd_field_iterator_t *qd_field_iterator_sub(const qd_field_iterator_t *iter, uint32_t length)
{
qd_field_iterator_t *sub = new_qd_field_iterator_t();
if (!sub)
@@ -430,13 +452,19 @@ qd_field_iterator_t *qd_field_iterator_s
void qd_field_iterator_advance(qd_field_iterator_t *iter, uint32_t length)
{
- // TODO - Make this more efficient.
- for (uint8_t idx = 0; idx < length && !qd_field_iterator_end(iter); idx++)
- qd_field_iterator_octet(iter);
+ while (length > 0 && !qd_field_iterator_end(iter)) {
+ if (iter->state == STATE_IN_ADDRESS) {
+ field_iterator_move_cursor(iter, length);
+ break;
+ } else {
+ qd_field_iterator_octet(iter);
+ length--;
+ }
+ }
}
-uint32_t qd_field_iterator_remaining(qd_field_iterator_t *iter)
+uint32_t qd_field_iterator_remaining(const qd_field_iterator_t *iter)
{
return iter->pointer.length;
}
@@ -447,11 +475,13 @@ int qd_field_iterator_equal(qd_field_ite
qd_field_iterator_reset(iter);
while (!qd_field_iterator_end(iter) && *string) {
if (*string != qd_field_iterator_octet(iter))
- return 0;
+ break;
string++;
}
- return (qd_field_iterator_end(iter) && (*string == 0));
+ int match = (qd_field_iterator_end(iter) && (*string == 0));
+ qd_field_iterator_reset(iter);
+ return match;
}
@@ -474,11 +504,13 @@ int qd_field_iterator_prefix(qd_field_it
return 1;
}
-int qd_field_iterator_length(qd_field_iterator_t *iter) {
+int qd_field_iterator_length(const qd_field_iterator_t *iter)
+{
+ qd_field_iterator_t copy = *iter;
int length = 0;
- qd_field_iterator_reset(iter);
- while (!qd_field_iterator_end(iter)) {
- qd_field_iterator_octet(iter);
+ qd_field_iterator_reset(©);
+ while (!qd_field_iterator_end(©)) {
+ qd_field_iterator_octet(©);
length++;
}
return length;
Modified: qpid/dispatch/trunk/src/lrp.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/lrp.c?rev=1665503&r1=1665502&r2=1665503&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/lrp.c (original)
+++ qpid/dispatch/trunk/src/lrp.c Tue Mar 10 12:20:57 2015
@@ -48,8 +48,8 @@ static void qd_lrpc_open_handler(void *c
// Create an address iterator for the prefix address with the namespace
// prefix for link-attach routed addresses.
//
- iter = qd_field_iterator_string(lrp->prefix, ITER_VIEW_ADDRESS_HASH);
- qd_field_iterator_override_prefix(iter, qd_link_route_addr_prefix);
+ iter = qd_address_iterator_string(lrp->prefix, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_override_prefix(iter, qd_link_route_addr_prefix);
//
// Find the address in the router's hash table. If not found, create one
@@ -106,8 +106,8 @@ static void qd_lrpc_close_handler(void *
// Create an address iterator for the prefix address with the namespace
// prefix for link-attach routed addresses.
//
- iter = qd_field_iterator_string(lrp->prefix, ITER_VIEW_ADDRESS_HASH);
- qd_field_iterator_override_prefix(iter, qd_link_route_addr_prefix);
+ iter = qd_address_iterator_string(lrp->prefix, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_override_prefix(iter, qd_link_route_addr_prefix);
//
// Find the address in the router's hash table.
Modified: qpid/dispatch/trunk/src/message.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/message.c?rev=1665503&r1=1665502&r2=1665503&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/message.c (original)
+++ qpid/dispatch/trunk/src/message.c Tue Mar 10 12:20:57 2015
@@ -973,7 +973,7 @@ qd_field_iterator_t *qd_message_field_it
if (!loc)
return 0;
- return qd_field_iterator_buffer(loc->buffer, loc->offset, loc->length + loc->hdr_length, ITER_VIEW_ALL);
+ return qd_field_iterator_buffer(loc->buffer, loc->offset, loc->length + loc->hdr_length);
}
@@ -990,7 +990,7 @@ qd_field_iterator_t *qd_message_field_it
unsigned char *cursor = qd_buffer_base(loc->buffer) + loc->offset;
advance(&cursor, &buffer, loc->hdr_length, 0, 0);
- return qd_field_iterator_buffer(buffer, cursor - qd_buffer_base(buffer), loc->length, ITER_VIEW_ALL);
+ return qd_field_iterator_buffer(buffer, cursor - qd_buffer_base(buffer), loc->length);
}
Modified: qpid/dispatch/trunk/src/router_config.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/router_config.c?rev=1665503&r1=1665502&r2=1665503&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/router_config.c (original)
+++ qpid/dispatch/trunk/src/router_config.c Tue Mar 10 12:20:57 2015
@@ -210,8 +210,8 @@ qd_error_t qd_router_configure_lrp(qd_ro
//
char unused;
qd_address_t *addr;
- qd_field_iterator_t *iter = qd_field_iterator_string(prefix, ITER_VIEW_ADDRESS_HASH);
- qd_field_iterator_override_prefix(iter, 'C');
+ qd_field_iterator_t *iter = qd_address_iterator_string(prefix, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_override_prefix(iter, 'C');
//
// Find the address in the router's hash table. If not found, create one
@@ -272,7 +272,7 @@ void qd_router_configure_free(qd_router_
qd_address_semantics_t router_semantics_for_addr(qd_router_t *router, qd_field_iterator_t *iter,
char in_phase, char *out_phase)
{
- qd_field_iterator_reset_view(iter, ITER_VIEW_NO_HOST);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_NO_HOST);
qd_config_address_t *addr = DEQ_HEAD(router->config_addrs);
qd_config_phase_t *phase = 0;
Modified: qpid/dispatch/trunk/src/router_node.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/router_node.c?rev=1665503&r1=1665502&r2=1665503&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/router_node.c (original)
+++ qpid/dispatch/trunk/src/router_node.c Tue Mar 10 12:20:57 2015
@@ -364,8 +364,8 @@ static qd_address_t *router_lookup_termi
cursor++;
int len = (int) (cursor - taddr);
- qd_field_iterator_t *iter = qd_field_iterator_binary(taddr, len, ITER_VIEW_ADDRESS_HASH);
- qd_field_iterator_override_prefix(iter, 'C');
+ qd_field_iterator_t *iter = qd_address_iterator_binary(taddr, len, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_override_prefix(iter, 'C');
qd_address_t *addr;
qd_hash_retrieve(router->addr_hash, iter, (void*) &addr);
@@ -580,7 +580,6 @@ static qd_field_iterator_t *router_annot
qd_field_iterator_t *iter = qd_parse_raw(trace_item);
if (qd_field_iterator_equal(iter, (unsigned char*) node_id))
*drop = 1;
- qd_field_iterator_reset(iter);
qd_compose_insert_string_iterator(out_ma, iter);
idx++;
trace_item = qd_parse_sub_value(trace, idx);
@@ -700,7 +699,7 @@ static void router_forward_to_remote_sub
//
int origin = -1;
if (ingress_iter && !(addr->semantics & QD_BYPASS_VALID_ORIGINS)) {
- qd_field_iterator_reset_view(ingress_iter, ITER_VIEW_NODE_HASH);
+ qd_address_iterator_reset_view(ingress_iter, ITER_VIEW_NODE_HASH);
qd_address_t *origin_addr;
qd_hash_retrieve(router->addr_hash, ingress_iter, (void*) &origin_addr);
if (origin_addr && DEQ_SIZE(origin_addr->rnodes) == 1) {
@@ -851,8 +850,8 @@ static void router_rx_handler(void* cont
// address for the link.
//
if (!iter && rlink->waypoint) {
- iter = qd_field_iterator_string(rlink->waypoint->address, ITER_VIEW_ADDRESS_HASH);
- qd_field_iterator_set_phase(iter, rlink->waypoint->out_phase);
+ iter = qd_address_iterator_string(rlink->waypoint->address, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_set_phase(iter, rlink->waypoint->out_phase);
}
//
@@ -870,12 +869,12 @@ static void router_rx_handler(void* cont
// ref: https://issues.apache.org/jira/browse/DISPATCH-1
//
if (!iter && rlink->target) {
- iter = qd_field_iterator_string(rlink->target, ITER_VIEW_ALL);
+ iter = qd_address_iterator_string(rlink->target, ITER_VIEW_ALL);
to_override = rlink->target;
}
if (iter) {
- qd_field_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
//
// Note: This function is going to need to be refactored so we can put an
@@ -887,7 +886,7 @@ static void router_rx_handler(void* cont
//
qd_hash_retrieve(router->addr_hash, iter, (void*) &addr);
- qd_field_iterator_reset_view(iter, ITER_VIEW_NO_HOST);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_NO_HOST);
int is_local = qd_field_iterator_prefix(iter, local_prefix);
int is_direct = qd_field_iterator_prefix(iter, direct_prefix);
if (free_iter)
@@ -1393,7 +1392,7 @@ static int router_outgoing_link_handler(
// bound to an endpoint link.
//
if (r_src && !is_router && !is_dynamic) {
- iter = qd_field_iterator_string(r_src, ITER_VIEW_ADDRESS_HASH);
+ iter = qd_address_iterator_string(r_src, ITER_VIEW_ADDRESS_HASH);
unsigned char prefix = qd_field_iterator_octet(iter);
qd_field_iterator_reset(iter);
@@ -1434,8 +1433,8 @@ static int router_outgoing_link_handler(
semantics = QD_FANOUT_SINGLE | QD_BIAS_CLOSEST | QD_CONGESTION_BACKPRESSURE;
else {
semantics = router_semantics_for_addr(router, iter, '\0', &phase);
- qd_field_iterator_set_phase(iter, phase);
- qd_field_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_set_phase(iter, phase);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
}
sys_mutex_lock(router->lock);
@@ -1465,7 +1464,7 @@ static int router_outgoing_link_handler(
if (la_result == LINK_ATTACH_NO_MATCH) {
if (is_dynamic) {
qd_router_generate_temp_addr(router, temp_addr, 1000);
- iter = qd_field_iterator_string(temp_addr, ITER_VIEW_ADDRESS_HASH);
+ iter = qd_address_iterator_string(temp_addr, ITER_VIEW_ADDRESS_HASH);
pn_terminus_set_address(qd_link_source(link), temp_addr);
qd_log(router->log_source, QD_LOG_INFO, "Assigned temporary routable address=%s", temp_addr);
} else
@@ -2008,7 +2007,7 @@ qd_address_t *qd_router_register_address
qd_field_iterator_t *iter = 0;
snprintf(addr_string, sizeof(addr_string), "%s%s", global ? "M0" : "L", address);
- iter = qd_field_iterator_string(addr_string, ITER_VIEW_NO_HOST);
+ iter = qd_address_iterator_string(addr_string, ITER_VIEW_NO_HOST);
sys_mutex_lock(router->lock);
qd_hash_retrieve(router->addr_hash, iter, (void**) &addr);
@@ -2065,7 +2064,7 @@ void qd_router_send(qd_dispatch_t
qd_router_t *router = qd->router;
qd_address_t *addr;
- qd_field_iterator_reset_view(address, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_reset_view(address, ITER_VIEW_ADDRESS_HASH);
sys_mutex_lock(router->lock);
qd_hash_retrieve(router->addr_hash, address, (void*) &addr);
if (addr) {
@@ -2133,7 +2132,7 @@ void qd_router_send2(qd_dispatch_t *qd,
const char *address,
qd_message_t *msg)
{
- qd_field_iterator_t *iter = qd_field_iterator_string(address, ITER_VIEW_ADDRESS_HASH);
+ qd_field_iterator_t *iter = qd_address_iterator_string(address, ITER_VIEW_ADDRESS_HASH);
qd_router_send(qd, iter, msg);
qd_field_iterator_free(iter);
}
Modified: qpid/dispatch/trunk/src/router_pynode.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/router_pynode.c?rev=1665503&r1=1665502&r2=1665503&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/router_pynode.c (original)
+++ qpid/dispatch/trunk/src/router_pynode.c Tue Mar 10 12:20:57 2015
@@ -70,7 +70,7 @@ static PyObject *qd_add_router(PyObject
//
// Hash lookup the address to ensure there isn't an existing router address.
//
- qd_field_iterator_t *iter = qd_field_iterator_string(address, ITER_VIEW_ADDRESS_HASH);
+ qd_field_iterator_t *iter = qd_address_iterator_string(address, ITER_VIEW_ADDRESS_HASH);
qd_address_t *addr;
qd_hash_retrieve(router->addr_hash, iter, (void**) &addr);
@@ -457,7 +457,7 @@ static PyObject* qd_map_destination(PyOb
return 0;
}
- iter = qd_field_iterator_string(addr_string, ITER_VIEW_ALL);
+ iter = qd_address_iterator_string(addr_string, ITER_VIEW_ALL);
sys_mutex_lock(router->lock);
qd_hash_retrieve(router->addr_hash, iter, (void**) &addr);
@@ -508,7 +508,7 @@ static PyObject* qd_unmap_destination(Py
}
qd_router_node_t *rnode = router->routers_by_mask_bit[maskbit];
- qd_field_iterator_t *iter = qd_field_iterator_string(addr_string, ITER_VIEW_ALL);
+ qd_field_iterator_t *iter = qd_address_iterator_string(addr_string, ITER_VIEW_ALL);
sys_mutex_lock(router->lock);
qd_hash_retrieve(router->addr_hash, iter, (void**) &addr);
@@ -719,7 +719,7 @@ void qd_router_mobile_added(qd_router_t
PyObject *pValue;
if (pyAdded && router->router_mode == QD_ROUTER_MODE_INTERIOR) {
- qd_field_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
char *address = (char*) qd_field_iterator_copy(iter);
qd_python_lock_state_t lock_state = qd_python_lock();
Modified: qpid/dispatch/trunk/src/waypoint.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/waypoint.c?rev=1665503&r1=1665502&r2=1665503&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/waypoint.c (original)
+++ qpid/dispatch/trunk/src/waypoint.c Tue Mar 10 12:20:57 2015
@@ -59,8 +59,8 @@ static void qd_waypoint_visit_sink_LH(qd
// Compose the phased-address and search the routing table for the address.
// If it's not found, add it to the table but leave the link/router linkages empty.
//
- qd_field_iterator_t *iter = qd_field_iterator_string(wp->address, ITER_VIEW_ADDRESS_HASH);
- qd_field_iterator_set_phase(iter, wp->in_phase);
+ qd_field_iterator_t *iter = qd_address_iterator_string(wp->address, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_set_phase(iter, wp->in_phase);
qd_hash_retrieve(router->addr_hash, iter, (void*) &addr);
if (!addr) {
@@ -104,8 +104,8 @@ static void qd_waypoint_visit_sink_LH(qd
qd_router_add_link_ref_LH(&addr->rlinks, rlink);
if (DEQ_SIZE(addr->rlinks) == 1) {
- qd_field_iterator_t *iter = qd_field_iterator_string(wp->address, ITER_VIEW_ADDRESS_HASH);
- qd_field_iterator_set_phase(iter, wp->in_phase);
+ qd_field_iterator_t *iter = qd_address_iterator_string(wp->address, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_set_phase(iter, wp->in_phase);
qd_router_mobile_added(router, iter);
qd_field_iterator_free(iter);
}
@@ -133,8 +133,8 @@ static void qd_waypoint_visit_source_LH(
// Compose the phased-address and search the routing table for the address.
// If it's not found, add it to the table but leave the link/router linkages empty.
//
- qd_field_iterator_t *iter = qd_field_iterator_string(wp->address, ITER_VIEW_ADDRESS_HASH);
- qd_field_iterator_set_phase(iter, wp->out_phase);
+ qd_field_iterator_t *iter = qd_address_iterator_string(wp->address, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_set_phase(iter, wp->out_phase);
qd_hash_retrieve(router->addr_hash, iter, (void*) &addr);
if (!addr) {
Modified: qpid/dispatch/trunk/tests/field_test.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/tests/field_test.c?rev=1665503&r1=1665502&r2=1665503&view=diff
==============================================================================
--- qpid/dispatch/trunk/tests/field_test.c (original)
+++ qpid/dispatch/trunk/tests/field_test.c Tue Mar 10 12:20:57 2015
@@ -25,25 +25,51 @@
#define FAIL_TEXT_SIZE 10000
static char fail_text[FAIL_TEXT_SIZE];
+static void build_buffer_chain(qd_buffer_list_t *chain,
+ const char *text,
+ int segment_size)
+{
+ int len = strlen(text);
+ while (len) {
+ int count = (segment_size > len) ? len : segment_size;
+ qd_buffer_t *buf = qd_buffer();
+ count = (qd_buffer_capacity(buf) < count) ? qd_buffer_capacity(buf) : count;
+ memcpy(qd_buffer_cursor(buf), text, count);
+ qd_buffer_insert(buf, count);
+ DEQ_INSERT_TAIL(*chain, buf);
+ len -= count;
+ text += count;
+ }
+}
+
+static void release_buffer_chain(qd_buffer_list_t *chain)
+{
+ while (DEQ_SIZE(*chain)) {
+ qd_buffer_t *buf = DEQ_HEAD(*chain);
+ DEQ_REMOVE_HEAD(*chain);
+ qd_buffer_free(buf);
+ }
+}
+
static char* test_view_global_dns(void *context)
{
- qd_field_iterator_t *iter = qd_field_iterator_string("amqp://host/global/sub", ITER_VIEW_ALL);
+ qd_field_iterator_t *iter = qd_address_iterator_string("amqp://host/global/sub", ITER_VIEW_ALL);
if (!qd_field_iterator_equal(iter, (unsigned char*) "amqp://host/global/sub"))
return "ITER_VIEW_ALL failed";
- qd_field_iterator_reset_view(iter, ITER_VIEW_NO_HOST);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_NO_HOST);
if (!qd_field_iterator_equal(iter, (unsigned char*) "global/sub"))
return "ITER_VIEW_NO_HOST failed";
- qd_field_iterator_reset_view(iter, ITER_VIEW_NODE_ID);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_ID);
if (!qd_field_iterator_equal(iter, (unsigned char*) "global"))
return "ITER_VIEW_NODE_ID failed";
- qd_field_iterator_reset_view(iter, ITER_VIEW_NODE_SPECIFIC);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_SPECIFIC);
if (!qd_field_iterator_equal(iter, (unsigned char*) "sub"))
return "ITER_VIEW_NODE_SPECIFIC failed";
- qd_field_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
if (!qd_field_iterator_equal(iter, (unsigned char*) "M0global/sub"))
return "ITER_VIEW_ADDRESS_HASH failed";
@@ -55,23 +81,23 @@ static char* test_view_global_dns(void *
static char* test_view_global_non_dns(void *context)
{
- qd_field_iterator_t *iter = qd_field_iterator_string("amqp:/global/sub", ITER_VIEW_ALL);
+ qd_field_iterator_t *iter = qd_address_iterator_string("amqp:/global/sub", ITER_VIEW_ALL);
if (!qd_field_iterator_equal(iter, (unsigned char*) "amqp:/global/sub"))
return "ITER_VIEW_ALL failed";
- qd_field_iterator_reset_view(iter, ITER_VIEW_NO_HOST);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_NO_HOST);
if (!qd_field_iterator_equal(iter, (unsigned char*) "global/sub"))
return "ITER_VIEW_NO_HOST failed";
- qd_field_iterator_reset_view(iter, ITER_VIEW_NODE_ID);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_ID);
if (!qd_field_iterator_equal(iter, (unsigned char*) "global"))
return "ITER_VIEW_NODE_ID failed";
- qd_field_iterator_reset_view(iter, ITER_VIEW_NODE_SPECIFIC);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_SPECIFIC);
if (!qd_field_iterator_equal(iter, (unsigned char*) "sub"))
return "ITER_VIEW_NODE_SPECIFIC failed";
- qd_field_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
if (!qd_field_iterator_equal(iter, (unsigned char*) "M0global/sub"))
return "ITER_VIEW_ADDRESS_HASH failed";
@@ -83,23 +109,23 @@ static char* test_view_global_non_dns(vo
static char* test_view_global_no_host(void *context)
{
- qd_field_iterator_t *iter = qd_field_iterator_string("global/sub", ITER_VIEW_ALL);
+ qd_field_iterator_t *iter = qd_address_iterator_string("global/sub", ITER_VIEW_ALL);
if (!qd_field_iterator_equal(iter, (unsigned char*) "global/sub"))
return "ITER_VIEW_ALL failed";
- qd_field_iterator_reset_view(iter, ITER_VIEW_NO_HOST);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_NO_HOST);
if (!qd_field_iterator_equal(iter, (unsigned char*) "global/sub"))
return "ITER_VIEW_NO_HOST failed";
- qd_field_iterator_reset_view(iter, ITER_VIEW_NODE_ID);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_ID);
if (!qd_field_iterator_equal(iter, (unsigned char*) "global"))
return "ITER_VIEW_NODE_ID failed";
- qd_field_iterator_reset_view(iter, ITER_VIEW_NODE_SPECIFIC);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_NODE_SPECIFIC);
if (!qd_field_iterator_equal(iter, (unsigned char*) "sub"))
return "ITER_VIEW_NODE_SPECIFIC failed";
- qd_field_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
if (!qd_field_iterator_equal(iter, (unsigned char*) "M0global/sub"))
return "ITER_VIEW_ADDRESS_HASH failed";
@@ -109,6 +135,19 @@ static char* test_view_global_no_host(vo
}
+static char* view_address_hash(void *context, qd_field_iterator_t *iter,
+ const char *addr, const char *view)
+{
+ qd_address_iterator_set_phase(iter, '1');
+ if (!qd_field_iterator_equal(iter, (unsigned char*) view)) {
+ char *got = (char*) qd_field_iterator_copy(iter);
+ snprintf(fail_text, FAIL_TEXT_SIZE, "Addr '%s' failed. Expected '%s', got '%s'",
+ addr, view, got);
+ return fail_text;
+ }
+ return 0;
+}
+
static char* test_view_address_hash(void *context)
{
struct {const char *addr; const char *view;} cases[] = {
@@ -131,15 +170,22 @@ static char* test_view_address_hash(void
int idx;
for (idx = 0; cases[idx].addr; idx++) {
- qd_field_iterator_t *iter = qd_field_iterator_string(cases[idx].addr, ITER_VIEW_ADDRESS_HASH);
- qd_field_iterator_set_phase(iter, '1');
- if (!qd_field_iterator_equal(iter, (unsigned char*) cases[idx].view)) {
- char *got = (char*) qd_field_iterator_copy(iter);
- snprintf(fail_text, FAIL_TEXT_SIZE, "Addr '%s' failed. Expected '%s', got '%s'",
- cases[idx].addr, cases[idx].view, got);
- return fail_text;
- }
+ qd_field_iterator_t *iter = qd_address_iterator_string(cases[idx].addr, ITER_VIEW_ADDRESS_HASH);
+ char *ret = view_address_hash(context, iter, cases[idx].addr, cases[idx].view);
qd_field_iterator_free(iter);
+ if (ret) return ret;
+ }
+
+ for (idx = 0; cases[idx].addr; idx++) {
+ qd_buffer_list_t chain;
+ DEQ_INIT(chain);
+ build_buffer_chain(&chain, cases[idx].addr, 3);
+ qd_field_iterator_t *iter = qd_address_iterator_buffer(DEQ_HEAD(chain), 0,
+ strlen(cases[idx].addr),
+ ITER_VIEW_ADDRESS_HASH);
+ char *ret = view_address_hash(context, iter, cases[idx].addr, cases[idx].view);
+ release_buffer_chain(&chain);
+ if (ret) return ret;
}
return 0;
@@ -157,8 +203,8 @@ static char* test_view_address_hash_over
int idx;
for (idx = 0; cases[idx].addr; idx++) {
- qd_field_iterator_t *iter = qd_field_iterator_string(cases[idx].addr, ITER_VIEW_ADDRESS_HASH);
- qd_field_iterator_override_prefix(iter, 'C');
+ qd_field_iterator_t *iter = qd_address_iterator_string(cases[idx].addr, ITER_VIEW_ADDRESS_HASH);
+ qd_address_iterator_override_prefix(iter, 'C');
if (!qd_field_iterator_equal(iter, (unsigned char*) cases[idx].view)) {
char *got = (char*) qd_field_iterator_copy(iter);
snprintf(fail_text, FAIL_TEXT_SIZE, "Addr '%s' failed. Expected '%s', got '%s'",
@@ -183,7 +229,7 @@ static char* test_view_node_hash(void *c
int idx;
for (idx = 0; cases[idx].addr; idx++) {
- qd_field_iterator_t *iter = qd_field_iterator_string(cases[idx].addr, ITER_VIEW_NODE_HASH);
+ qd_field_iterator_t *iter = qd_address_iterator_string(cases[idx].addr, ITER_VIEW_NODE_HASH);
if (!qd_field_iterator_equal(iter, (unsigned char*) cases[idx].view)) {
char *got = (char*) qd_field_iterator_copy(iter);
snprintf(fail_text, FAIL_TEXT_SIZE, "Addr '%s' failed. Expected '%s', got '%s'",
@@ -197,6 +243,68 @@ static char* test_view_node_hash(void *c
return 0;
}
+static char *field_advance_test(void *context,
+ qd_field_iterator_t *iter,
+ const unsigned char *template,
+ int increment)
+{
+ const unsigned char *original = template;
+ while (*template) {
+ // since qd_field_iterator_equal() resets the iterator to its original
+ // view, we need to snapshot the iterator at the current point:
+ qd_field_iterator_t *raw = qd_field_iterator_sub(iter,
+ qd_field_iterator_remaining(iter));
+ if (!qd_field_iterator_equal(raw, (unsigned char*) template)) {
+
+ snprintf(fail_text, FAIL_TEXT_SIZE,
+ "Field advance failed. Expected '%s'",
+ (char *)template );
+ return fail_text;
+ }
+ qd_field_iterator_advance(iter, increment);
+ template += increment;
+ qd_field_iterator_free(raw);
+ }
+ if (!qd_field_iterator_end(iter))
+ return "Field advance to end failed";
+
+ qd_field_iterator_reset(iter);
+ if (!qd_field_iterator_equal(iter, (unsigned char*) original))
+ return "Field advance reset failed";
+
+ // try something stupid:
+ qd_field_iterator_advance(iter, strlen((const char*)original) + 84);
+ // expect no more data
+ if (qd_field_iterator_octet(iter) || !qd_field_iterator_end(iter))
+ return "Field over advance failed";
+
+ qd_field_iterator_free(iter);
+ return 0;
+
+}
+
+
+static char* test_field_advance_string(void *context)
+{
+ const char *template = "abcdefghijklmnopqrstuvwxyz";
+ qd_field_iterator_t *iter = qd_field_iterator_string(template);
+ return field_advance_test(context, iter,
+ (const unsigned char*)template, 2);
+}
+
+
+static char* test_field_advance_buffer(void *context)
+{
+ qd_buffer_list_t chain;
+ DEQ_INIT(chain);
+ const unsigned char *template = (unsigned char *)"AAABBB";
+ build_buffer_chain(&chain, (const char *)template, 3);
+ qd_field_iterator_t *iter = qd_field_iterator_buffer(DEQ_HEAD(chain), 0, 6);
+ char *ret = field_advance_test(context, iter, template, 1);
+ release_buffer_chain(&chain);
+ return ret;
+}
+
int field_tests(void)
{
@@ -210,6 +318,8 @@ int field_tests(void)
TEST_CASE(test_view_address_hash, 0);
TEST_CASE(test_view_address_hash_override, 0);
TEST_CASE(test_view_node_hash, 0);
+ TEST_CASE(test_field_advance_string, 0);
+ TEST_CASE(test_field_advance_buffer, 0);
return result;
}
Modified: qpid/dispatch/trunk/tests/parse_test.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/tests/parse_test.c?rev=1665503&r1=1665502&r2=1665503&view=diff
==============================================================================
--- qpid/dispatch/trunk/tests/parse_test.c (original)
+++ qpid/dispatch/trunk/tests/parse_test.c Tue Mar 10 12:20:57 2015
@@ -66,8 +66,7 @@ static char *test_parser_fixed_scalars(v
while (fs_vectors[idx].data) {
qd_field_iterator_t *field = qd_field_iterator_binary(fs_vectors[idx].data,
- fs_vectors[idx].length,
- ITER_VIEW_ALL);
+ fs_vectors[idx].length);
qd_parsed_field_t *parsed = qd_parse(field);
if (!qd_parse_ok(parsed)) return "Unexpected Parse Error";
if (qd_parse_tag(parsed) != fs_vectors[idx].expected_tag) {
@@ -134,8 +133,7 @@ static char *test_parser_errors(void *co
while (err_vectors[idx].data) {
qd_field_iterator_t *field = qd_field_iterator_binary(err_vectors[idx].data,
- err_vectors[idx].length,
- ITER_VIEW_ALL);
+ err_vectors[idx].length);
qd_parsed_field_t *parsed = qd_parse(field);
if (qd_parse_ok(parsed)) {
sprintf(error, "(%d) Unexpected Parse Success", idx);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org