diff options
Diffstat (limited to 'erts/include/erl_memory_trace_parser.h')
-rw-r--r-- | erts/include/erl_memory_trace_parser.h | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/erts/include/erl_memory_trace_parser.h b/erts/include/erl_memory_trace_parser.h new file mode 100644 index 0000000000..3b6f76d2fd --- /dev/null +++ b/erts/include/erl_memory_trace_parser.h @@ -0,0 +1,156 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2004-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + + +/* + * Description: + * + * Author: Rickard Green + */ + +#ifndef ERL_MTRACE_PARSER_H__ +#define ERL_MTRACE_PARSER_H__ + +#include <stdlib.h> +#include "erl_fixed_size_int_types.h" + +/* emtp_parse() return values */ +#define EMTP_MIN_ERROR EMTP_NO_TRACE_ERROR + +#define EMTP_NO_TRACE_ERROR (-11) +#define EMTP_HEADER_TAG_IN_BODY_ERROR (-10) +#define EMTP_BODY_TAG_IN_HEADER_ERROR ( -9) +#define EMTP_NOT_SUPPORTED_MTRACE_VERSION_ERROR ( -8) +#define EMTP_NOT_AN_ERL_MTRACE_ERROR ( -7) +#define EMTP_NO_MEMORY_ERROR ( -6) +#define EMTP_BAD_OP_SIZE_ERROR ( -5) +#define EMTP_NO_OPERATIONS_ERROR ( -4) +#define EMTP_NOT_SUPPORTED_64_BITS_TRACE_ERROR ( -3) +#define EMTP_PARSE_ERROR ( -2) +#define EMTP_UNKNOWN_TAG_ERROR ( -1) +#define EMTP_END_OF_TRACE ( 0) +#define EMTP_END_OF_TRACE_GARBAGE_FOLLOWS ( 1) +#define EMTP_ALL_OPS_FILLED ( 2) +#define EMTP_NEED_MORE_TRACE ( 3) +#define EMTP_HEADER_PARSED ( 4) + +/* Allocator flags */ +#define EMTP_ALLOCATOR_FLAG_HAVE_USED_CARRIERS_INFO (1 << 0) + +/* Block type flags */ +/* #define EMTP_BLOCK_TYPE_FLAG_X */ + + +typedef struct { + usgnd_int_32 major; + usgnd_int_32 minor; +} emtp_version; + +typedef struct { + emtp_version parser; + emtp_version trace; +} emtp_versions; + +typedef struct { + int valid; + usgnd_int_32 flags; + char * name; + struct { + usgnd_int_16 no_providers; + usgnd_int_16 * provider; + } carrier; +} emtp_allocator; + +typedef struct { + int valid; + usgnd_int_32 flags; + char * name; + sgnd_int_32 allocator; +} emtp_block_type; + +typedef struct { + emtp_versions version; + int bits; + char * nodename; + char * hostname; + char * pid; + struct { + usgnd_int_32 year; + usgnd_int_32 month; + usgnd_int_32 day; + usgnd_int_32 hour; + usgnd_int_32 minute; + usgnd_int_32 second; + usgnd_int_32 micro_second; + } start_time; + usgnd_int_16 segment_ix; + usgnd_int_16 max_allocator_ix; + emtp_allocator ** allocator; + usgnd_int_16 max_block_type_ix; + emtp_block_type ** block_type; + int have_carrier_info; + int have_segment_carrier_info; +} emtp_info; + +typedef struct emtp_state_ emtp_state; + +enum emtp_op_type_ { + EMTP_UNDEF = 0, + EMTP_ALLOC = 1, + EMTP_REALLOC = 2, + EMTP_FREE = 3, + EMTP_CARRIER_ALLOC = 4, + EMTP_CARRIER_REALLOC = 5, + EMTP_CARRIER_FREE = 6, + EMTP_STOP = 7, + EMTP_EXIT = 8 +}; + +typedef enum emtp_op_type_ emtp_op_type; + +typedef struct { + usgnd_int_16 type; + usgnd_int_16 carrier_type; + usgnd_int_max new_ptr; + usgnd_int_max prev_ptr; + usgnd_int_max new_size; +} emtp_block_op; + +typedef struct { + emtp_op_type type; + struct { + usgnd_int_32 secs; + usgnd_int_32 usecs; + } time; + union { + emtp_block_op block; + usgnd_int_32 exit_status; + } u; +} emtp_operation; + +const char *emtp_error_string(int); +int emtp_get_info(emtp_info *ip, size_t *isz, emtp_state *sp); +emtp_state *emtp_state_new(void * (*alloc)(size_t), + void * (*realloc)(void *, size_t), + void (*free)(void *)); +void emtp_state_destroy(emtp_state *sp); +int emtp_parse(emtp_state *sp, + usgnd_int_8 **tracepp, size_t *trace_lenp, + emtp_operation *op_start, size_t op_size, size_t *op_lenp); +#endif |