提交 8e473890 编写于 作者: M Maxim Polyakov

Fix test-malloc-stats-print and test-malloc-info

Signed-off-by: NMaxim Polyakov <polyakov.maksim@huawei.com>
上级 fc2b8ddd
...@@ -40,9 +40,11 @@ typedef struct ...@@ -40,9 +40,11 @@ typedef struct
static void stderr_stats_cb(void); static void stderr_stats_cb(void);
static int populate_thread_stats(const char *input, const char *thread_id, malloc_thread_stats_t *stats); static int populate_thread_stats(const char *output, const char *thread_id, malloc_thread_stats_t *stats);
static int populate_total_free_heap_space(const char *input, long long *total_free_heap_space); static int populate_total_free_heap_space(const char *output, long long *total_free_heap_space);
static int is_thread_in_output(const char *output, const char *thread_id);
static void print_to_file(void *fp, const char *s) static void print_to_file(void *fp, const char *s)
{ {
...@@ -190,7 +192,7 @@ static int validate_different_threads_test_results(test_results_t *test_results) ...@@ -190,7 +192,7 @@ static int validate_different_threads_test_results(test_results_t *test_results)
malloc_thread_stats_t thread_stats; malloc_thread_stats_t thread_stats;
result &= populate_thread_stats(test_results->stats_after_allocations, test_results->threads[i], &thread_stats); result &= populate_thread_stats(test_results->stats_after_allocations, test_results->threads[i], &thread_stats);
result &= validate_allocated_size(sizes[i], &thread_stats); result &= validate_allocated_size(sizes[i], &thread_stats);
if (strstr(test_results->stats_after_free, test_results->threads[i]) != NULL) if (is_thread_in_output(test_results->stats_after_free, test_results->threads[i]))
{ {
t_error("Thread %s did not disappear from output\n", test_results->threads[i]); t_error("Thread %s did not disappear from output\n", test_results->threads[i]);
result = 0; result = 0;
......
...@@ -103,24 +103,24 @@ static long long parse_amount(const char *s) ...@@ -103,24 +103,24 @@ static long long parse_amount(const char *s)
return result; return result;
} }
static int populate_thread_stats(const char *input, const char *thread_id, malloc_thread_stats_t *stats) static xmlNodePtr find_thread_in_document(xmlDocPtr doc_ptr, const char *thread_id)
{ {
xmlDocPtr doc_ptr = xmlParseDoc((const xmlChar *)input);
if (doc_ptr == NULL)
{
return 0;
}
xmlNodePtr root_element = xmlDocGetRootElement(doc_ptr); xmlNodePtr root_element = xmlDocGetRootElement(doc_ptr);
xmlNodePtr thread_root;
if (strcmp(thread_id, "abandoned") == 0) if (strcmp(thread_id, "abandoned") == 0)
{ {
thread_root = find_child_node("abandoned", root_element); return find_child_node("abandoned", root_element);
} }
else return find_child_node_with_attr("thread", "id", thread_id, find_child_node("threads", root_element));
}
static int populate_thread_stats(const char *output, const char *thread_id, malloc_thread_stats_t *stats)
{
xmlDocPtr doc_ptr = xmlParseDoc((const xmlChar *)output);
if (doc_ptr == NULL)
{ {
xmlNodePtr threads = find_child_node("threads", root_element); return 0;
thread_root = find_child_node_with_attr("thread", "id", thread_id, threads);
} }
xmlNodePtr thread_root = find_thread_in_document(doc_ptr, thread_id);
long long total_allocated_memory = long long total_allocated_memory =
parse_amount(get_node_text(find_child_node("total_allocated_memory", thread_root))); parse_amount(get_node_text(find_child_node("total_allocated_memory", thread_root)));
long long total_mmapped_memory = long long total_mmapped_memory =
...@@ -139,9 +139,9 @@ static int populate_thread_stats(const char *input, const char *thread_id, mallo ...@@ -139,9 +139,9 @@ static int populate_thread_stats(const char *input, const char *thread_id, mallo
return 1; return 1;
} }
static int populate_total_free_heap_space(const char *input, long long *total_free_heap_space) static int populate_total_free_heap_space(const char *output, long long *total_free_heap_space)
{ {
xmlDocPtr doc_ptr = xmlParseDoc((const xmlChar *)input); xmlDocPtr doc_ptr = xmlParseDoc((const xmlChar *)output);
if (doc_ptr == NULL) if (doc_ptr == NULL)
{ {
return 0; return 0;
...@@ -156,4 +156,15 @@ static int populate_total_free_heap_space(const char *input, long long *total_fr ...@@ -156,4 +156,15 @@ static int populate_total_free_heap_space(const char *input, long long *total_fr
} }
*total_free_heap_space = total_free_heap_space_parsed; *total_free_heap_space = total_free_heap_space_parsed;
return 1; return 1;
}
static int is_thread_in_output(const char *output, const char *thread_id)
{
xmlDocPtr doc_ptr = xmlParseDoc((const xmlChar *)output);
if (doc_ptr == NULL)
{
return 0;
}
int result = find_thread_in_document(doc_ptr, thread_id) != NULL;
xmlFreeDoc(doc_ptr);
return result;
} }
\ No newline at end of file
...@@ -13,14 +13,18 @@ ...@@ -13,14 +13,18 @@
* limitations under the License. * limitations under the License.
*/ */
#include <regex.h>
#include "test-malloc-info-stats-print.h" #include "test-malloc-info-stats-print.h"
#define THREAD_DATA_REGEX_LEN (MAX_TID_LEN + 43)
#define REGEX_NMATCH 1
static void stderr_stats_cb(void) static void stderr_stats_cb(void)
{ {
malloc_stats_print(print_to_file, stderr, ""); malloc_stats_print(print_to_file, stderr, "");
} }
static int parse_amount(char **s, long long *destination) static int parse_amount(const char **s, long long *destination)
{ {
char *end_ptr = NULL; char *end_ptr = NULL;
long long result = strtoll(*s, &end_ptr, 10); long long result = strtoll(*s, &end_ptr, 10);
...@@ -35,27 +39,53 @@ static int parse_amount(char **s, long long *destination) ...@@ -35,27 +39,53 @@ static int parse_amount(char **s, long long *destination)
return 1; return 1;
} }
static int populate_thread_stats(const char *input, const char *thread_id, malloc_thread_stats_t *stats) static const char * find_thread_in_output(const char *output, const char *thread_id)
{
char thread_data_regex_s[THREAD_DATA_REGEX_LEN + 1];
snprintf(thread_data_regex_s, THREAD_DATA_REGEX_LEN, "^%s([[:space:]]+[[:digit:]]+){3}[[:space:]]*$", thread_id);
regex_t thread_data_regex;
if (regcomp(&thread_data_regex, thread_data_regex_s, REG_EXTENDED | REG_NEWLINE) != 0) {
t_error("Failed to compile regex %s", thread_data_regex_s);
return NULL;
}
regmatch_t pmatch[REGEX_NMATCH];
int match_result = regexec(&thread_data_regex, output, REGEX_NMATCH, pmatch, 0);
regfree(&thread_data_regex);
if (match_result != 0) {
return NULL;
}
return output + pmatch[0].rm_so;
}
static int populate_thread_stats(const char *output, const char *thread_id, malloc_thread_stats_t *stats)
{ {
char *thread_id_start = strstr(input, thread_id); const char *thread_data_start = find_thread_in_output(output, thread_id);
if (thread_id_start == NULL) { if (thread_data_start == NULL) {
t_error("Failed to find thread id %s in output", thread_id);
return 0; return 0;
} }
thread_id_start += strlen(thread_id);
thread_data_start += strlen(thread_id);
int result = 1; int result = 1;
result &= parse_amount(&thread_id_start, &stats->total_allocated_memory); result &= parse_amount(&thread_data_start, &stats->total_allocated_memory);
result &= parse_amount(&thread_id_start, &stats->total_mmapped_memory); result &= parse_amount(&thread_data_start, &stats->total_mmapped_memory);
result &= parse_amount(&thread_id_start, &stats->mmapped_regions); result &= parse_amount(&thread_data_start, &stats->mmapped_regions);
return result; return result;
} }
static int populate_total_free_heap_space(const char *input, long long *total_free_heap_space) static int populate_total_free_heap_space(const char *output, long long *total_free_heap_space)
{ {
char *free_heap_space_start = strstr(input, "total free heap space:"); const char *free_heap_space_start = strstr(output, "total free heap space:");
if (free_heap_space_start == NULL) { if (free_heap_space_start == NULL) {
return 0; return 0;
} }
free_heap_space_start += strlen("total free heap space:"); free_heap_space_start += strlen("total free heap space:");
return parse_amount(&free_heap_space_start, total_free_heap_space); return parse_amount(&free_heap_space_start, total_free_heap_space);
} }
static int is_thread_in_output(const char *output, const char *thread_id)
{
return find_thread_in_output(output, thread_id) != NULL;
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册