1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
14 * The Original Code is the trace-malloc Allocation Dump Reader (adreader).
16 * The Initial Developer of the Original Code is L. David Baron.
17 * Portions created by the Initial Developer are Copyright (C) 2002
18 * the Initial Developer. All Rights Reserved.
21 * L. David Baron <dbaron@dbaron.org> (original author)
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
35 * ***** END LICENSE BLOCK ***** */
45 mEntries
.mNext
= static_cast<EntryBlock
*>(&mEntries
);
46 mEntries
.mPrev
= static_cast<EntryBlock
*>(&mEntries
);
51 for (const_iterator entry
= begin(), entry_end
= end();
52 entry
!= entry_end
; ++entry
) {
53 free((void*) (*entry
)->type
);
54 free((char*) (*entry
)->data
);
55 free((char*) (*entry
)->allocation_stack
);
58 for (EntryBlock
*b
= mEntries
.mNext
, *next
; b
!= &mEntries
; b
= next
) {
65 ADLog::Read(const char* aFileName
)
67 FILE *in
= fopen(aFileName
, "r");
76 int res
= fscanf(in
, "%x %s (%d)\n", &ptr
, typebuf
, &datasize
);
83 size_t data_mem_size
= ((datasize
+ sizeof(unsigned long) - 1) /
84 sizeof(unsigned long)) * sizeof(unsigned long);
85 char *data
= (char*)malloc(data_mem_size
);
87 for (unsigned long *cur_data
= (unsigned long*) data
,
88 *cur_data_end
= (unsigned long*) ((char*)data
+ data_mem_size
);
89 cur_data
!= cur_data_end
; ++cur_data
) {
90 res
= fscanf(in
, " %lX\n", cur_data
);
96 char stackbuf
[100000];
99 char *stack
= stackbuf
;
102 fgets(stack
, sizeof(stackbuf
) - (stack
- stackbuf
), in
);
107 if (mEntryCount
% ADLOG_ENTRY_BLOCK_SIZE
== 0) {
108 EntryBlock
*new_block
= new EntryBlock();
109 new_block
->mNext
= static_cast<EntryBlock
*>(&mEntries
);
110 new_block
->mPrev
= mEntries
.mPrev
;
111 mEntries
.mPrev
->mNext
= new_block
;
112 mEntries
.mPrev
= new_block
;
115 size_t typelen
= strlen(typebuf
);
116 char *type
= (char*)malloc(typelen
-1);
117 strncpy(type
, typebuf
+1, typelen
-2);
118 type
[typelen
-2] = '\0';
121 &mEntries
.mPrev
->entries
[mEntryCount
% ADLOG_ENTRY_BLOCK_SIZE
];
122 entry
->address
= (Pointer
)ptr
;
124 entry
->datasize
= datasize
;
126 entry
->allocation_stack
= strdup(stackbuf
);
134 ADLog::const_iterator::const_iterator(ADLog::EntryBlock
*aBlock
,
138 mCur
= mBlockStart
+ aOffset
;
141 ADLog::const_iterator
&
142 ADLog::const_iterator::operator++()
145 if (mCur
== mBlockEnd
) {
146 SetBlock(mBlock
->mNext
);
153 ADLog::const_iterator
&
154 ADLog::const_iterator::operator--()
156 if (mCur
== mBlockStart
) {
157 SetBlock(mBlock
->mPrev
);