1 /* -*- Mode: C++; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 * http://www.mozilla.org/MPL/
10 * Software distributed under the License is distributed on an "AS IS" basis,
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 * for the specific language governing rights and limitations under the
15 * The Original Code is Mozilla code.
17 * The Initial Developer of the Original Code is
18 * Mozilla Corporation.
19 * Portions created by the Initial Developer are Copyright (C) 2009
20 * the Initial Developer. All Rights Reserved.
23 * Vladimir Vukicevic <vladimir@pobox.com>
25 * Alternatively, the contents of this file may be used under the terms of
26 * either the GNU General Public License Version 2 or later (the "GPL"), or
27 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28 * in which case the provisions of the GPL or the LGPL are applicable instead
29 * of those above. If you wish to allow use of your version of this file only
30 * under the terms of either the GPL or the LGPL, and not to allow others to
31 * use your version of this file under the terms of the MPL, indicate your
32 * decision by deleting the provisions above and replace them with the notice
33 * and other provisions required by the GPL or the LGPL. If you do not delete
34 * the provisions above, a recipient may use your version of this file under
35 * the terms of any one of the MPL, the GPL or the LGPL.
37 * ***** END LICENSE BLOCK ***** */
39 // needed to get vsnprintf with glibc
40 #ifndef _ISOC99_SOURCE
41 #define _ISOC99_SOURCE
50 #include "mozilla/FunctionTimer.h"
53 #define vsnprintf _vsnprintf
58 using namespace mozilla
;
60 // This /must/ come before the call to InitTimers below,
61 // or its constructor will be called after we've already
62 // assigned the Now() value to it.
63 static TimeStamp sAppStart
;
65 nsAutoPtr
<FunctionTimerLog
> FunctionTimer::sLog
;
66 char *FunctionTimer::sBuf1
= nsnull
;
67 char *FunctionTimer::sBuf2
= nsnull
;
68 int FunctionTimer::sBufSize
= FunctionTimer::InitTimers();
69 unsigned FunctionTimer::sDepth
= 0;
72 FunctionTimer::InitTimers()
74 if (PR_GetEnv("MOZ_FT") == NULL
)
77 // ensure that this is initialized before us
80 sLog
= new FunctionTimerLog(PR_GetEnv("MOZ_FT"));
81 sBuf1
= (char *) malloc(BUF_LOG_LENGTH
);
82 sBuf2
= (char *) malloc(BUF_LOG_LENGTH
);
83 sAppStart
= TimeStamp::Now();
85 return BUF_LOG_LENGTH
;
88 FunctionTimerLog::FunctionTimerLog(const char *fname
)
91 if (strcmp(fname
, "stdout") == 0) {
93 } else if (strcmp(fname
, "stderr") == 0) {
96 FILE *fp
= fopen(fname
, "wb");
98 NS_WARNING("FunctionTimerLog: Failed to open file specified, logging disabled!");
104 // Get 1ms resolution on Windows
109 FunctionTimerLog::~FunctionTimerLog()
111 if (mFile
&& mFile
!= stdout
&& mFile
!= stderr
)
112 fclose((FILE*)mFile
);
120 FunctionTimerLog::LogString(const char *str
)
123 mLatest
= TimeStamp::Now();
124 TimeDuration elapsed
= mLatest
- sAppStart
;
125 fprintf((FILE*)mFile
, "[% 9.2f] %s\n", elapsed
.ToSeconds() * 1000.0, str
);
130 FunctionTimerLog::LatestSinceStartup() const
132 return mLatest
- sAppStart
;
136 FunctionTimer::ft_vsnprintf(char *str
, int maxlen
, const char *fmt
, va_list args
)
138 return vsnprintf(str
, maxlen
, fmt
, args
);
142 FunctionTimer::ft_snprintf(char *str
, int maxlen
, const char *fmt
, ...)
147 int rval
= ft_vsnprintf(str
, maxlen
, fmt
, ap
);