File: Profiler.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (136 lines) | stat: -rw-r--r-- 4,029 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//------------------------------------------------------------------------------
// <copyright file="Profiler.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------

/*
 * Profiler.cs
 *
 * Copyright (c) 2000 Microsoft Corporation
 */

namespace System.Web.Util {

    using System;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Threading;
    using System.Collections;

    internal class Profiler {
        private int             _requestsToProfile;
        private Queue           _requests;
        private bool            _pageOutput;
        private bool            _isEnabled;
        private bool            _oldEnabled;
        private bool            _localOnly;
        private bool            _mostRecent;
        private TraceMode       _outputMode;


        internal Profiler() {
            _requestsToProfile = 10;
            _outputMode = TraceMode.SortByTime;
            _localOnly = true;
            _mostRecent = false;
            _requests = new Queue(_requestsToProfile);
        }

        internal bool IsEnabled {
            get { return _isEnabled;}
            set {
               _isEnabled = value;
               _oldEnabled = value;
            }
        }

        internal bool PageOutput {
            get {
                // calling HttpContext.Current is slow, but we'll only get there if _pageOutput is true.
                return (_pageOutput && !(_localOnly && !HttpContext.Current.Request.IsLocal));
            }
            set {
                _pageOutput = value;
            }
        }

        internal TraceMode OutputMode {
            get { return _outputMode;}
            set { _outputMode = value;}
        }

        internal bool LocalOnly {
            get { return _localOnly;}
            set { _localOnly = value; }
        }

        internal bool MostRecent {
            get { return _mostRecent; }
            set { _mostRecent = value; }
        }

        internal bool IsConfigEnabled {
            get { return _oldEnabled; }
        }

        internal int RequestsToProfile {
            get { return _requestsToProfile;}
            set {
                // VSWhidbey195368 Silently cap request limit at 10,000
                if (value > 10000) {
                    value = 10000;
                }
                _requestsToProfile = value;
            }
        }

        internal int RequestsRemaining {
            get { return _requestsToProfile - _requests.Count;}
        }

        internal void Reset() {
            // start profiling and clear the current log of requests
            _requests = new Queue(_requestsToProfile);

            if (_requestsToProfile != 0)
                _isEnabled = _oldEnabled;
            else
                _isEnabled = false;
        }

        internal void StartRequest(HttpContext context) {
            context.Trace.VerifyStart();
        }

        internal void EndRequest(HttpContext context) {
            context.Trace.EndRequest();

            // Don't add the trace data if we aren't enabled
            if (!IsEnabled) return;

            // grab trace data and add it to the list
            lock (_requests) {
                _requests.Enqueue(context.Trace.GetData());

                // If we are storing the most recent, we may need to kick out the first request
                if (MostRecent) {
                    if (_requests.Count > _requestsToProfile) _requests.Dequeue();
                }
            }

            // Turn off profiling if we are only tracking the first N requests and we hit the limit.
            if (!MostRecent && _requests.Count >= _requestsToProfile) EndProfiling();
        }

        internal void EndProfiling() {
            _isEnabled = false;
        }

        internal IList GetData() {
            return  _requests.ToArray();
        }

    }
}