diff options
-rw-r--r-- | src/libmdsserver/macros.h | 14 | ||||
-rw-r--r-- | src/mds-registry.c | 56 |
2 files changed, 35 insertions, 35 deletions
diff --git a/src/libmdsserver/macros.h b/src/libmdsserver/macros.h index 59537ff..cbef69c 100644 --- a/src/libmdsserver/macros.h +++ b/src/libmdsserver/macros.h @@ -323,6 +323,20 @@ /** + * Double to the size of an allocation on the heap + * + * @param old Variable in which to store the old value temporarily + * @param var The variable to which to assign the reallocation + * @param elements The number of elements to allocate + * @param type The data type of the elements for which to create an allocation + * @return :int Evaluates to true if an only if the allocation failed + */ +#define growalloc(old, var, elements, type) \ + (old = var, xrealloc(var, (elements) <<= 1, type) ? (var = old, (elements) >>= 1, perror(*argv), 1) : 0) + + + +/** * Go to the label `pfail` if a condition is met * * @param CONDITION The condition diff --git a/src/mds-registry.c b/src/mds-registry.c index 83702a1..e65d262 100644 --- a/src/mds-registry.c +++ b/src/mds-registry.c @@ -93,6 +93,11 @@ static pthread_mutex_t reg_mutex; */ static pthread_cond_t reg_cond; +/** + * Used to temporarily store the old value when reallocating heap-allocations + */ +static char* old; + /** @@ -436,11 +441,8 @@ int registry_action(size_t length, int action, const char* recv_client_id, const if (received.payload_size == length) { - if (xrealloc(received.payload, received.payload_size <<= 1, char)) + if (growalloc(old, received.payload, received.payload_size, char)) { - received.payload = payload; - received.payload_size >>= 1; - perror(*argv); if (wait_set != NULL) { hash_table_destroy(wait_set, NULL, NULL); @@ -578,20 +580,11 @@ int list_registry(const char* recv_client_id, const char* recv_message_id) if (send_buffer_size == 0) { - if (xmalloc(send_buffer, 256, char)) - { - perror(*argv); - return -1; - } + fail_if (xmalloc(send_buffer, 256, char)); send_buffer_size = 256; } - errno = pthread_mutex_lock(®_mutex); - if (errno) - { - perror(*argv); - return -1; - } + fail_if ((errno = pthread_mutex_lock(®_mutex))); for (i = 0; i < reg_table.capacity; i++) { @@ -603,17 +596,8 @@ int list_registry(const char* recv_client_id, const char* recv_message_id) size_t len = strlen(command); while (ptr + len + 1 >= send_buffer_size) - { - char* old = send_buffer; - if (xrealloc(send_buffer, send_buffer_size <<= 1, char)) - { - send_buffer = old; - send_buffer_size >>= 1; - perror(*argv); - pthread_mutex_unlock(®_mutex); - return -1; - } - } + if (growalloc(old, send_buffer, send_buffer_size, char)) + goto fail_in_mutex; memcpy(send_buffer + ptr, command, len * sizeof(char)); ptr += len; @@ -626,15 +610,8 @@ int list_registry(const char* recv_client_id, const char* recv_message_id) while (ptr + i >= send_buffer_size) { - char* old = send_buffer; - if (xrealloc(send_buffer, send_buffer_size <<= 1, char)) - { - send_buffer = old; - send_buffer_size >>= 1; - perror(*argv); - pthread_mutex_unlock(®_mutex); - return -1; - } + if (growalloc(old, send_buffer, send_buffer_size, char)) + goto fail_in_mutex; } sprintf(send_buffer + ptr, "To: %s\nIn response to: %s\nMessage ID: %" PRIi32 "\nLength: %" PRIu64 "\n\n", @@ -647,6 +624,15 @@ int list_registry(const char* recv_client_id, const char* recv_message_id) if (full_send(send_buffer + ptr, strlen(send_buffer + ptr))) return 1; return full_send(send_buffer, ptr); + + + fail_in_mutex: + pthread_mutex_unlock(®_mutex); + return -1; + + pfail: + perror(*argv); + return -1; } |