diff options
Diffstat (limited to 'tools/profiler/core/ProfileBuffer.h')
-rw-r--r-- | tools/profiler/core/ProfileBuffer.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/tools/profiler/core/ProfileBuffer.h b/tools/profiler/core/ProfileBuffer.h new file mode 100644 index 000000000..7d90fe385 --- /dev/null +++ b/tools/profiler/core/ProfileBuffer.h @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MOZ_PROFILE_BUFFER_H +#define MOZ_PROFILE_BUFFER_H + +#include "ProfileEntry.h" +#include "platform.h" +#include "ProfileJSONWriter.h" +#include "mozilla/RefPtr.h" +#include "mozilla/RefCounted.h" + +class ProfileBuffer : public mozilla::RefCounted<ProfileBuffer> { +public: + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(ProfileBuffer) + + explicit ProfileBuffer(int aEntrySize); + + virtual ~ProfileBuffer(); + + void addTag(const ProfileEntry& aTag); + void StreamSamplesToJSON(SpliceableJSONWriter& aWriter, int aThreadId, double aSinceTime, + JSContext* cx, UniqueStacks& aUniqueStacks); + void StreamMarkersToJSON(SpliceableJSONWriter& aWriter, int aThreadId, double aSinceTime, + UniqueStacks& aUniqueStacks); + void DuplicateLastSample(int aThreadId); + + void addStoredMarker(ProfilerMarker* aStoredMarker); + + // The following two methods are not signal safe! They delete markers. + void deleteExpiredStoredMarkers(); + void reset(); + +protected: + char* processDynamicTag(int readPos, int* tagsConsumed, char* tagBuff); + int FindLastSampleOfThread(int aThreadId); + +public: + // Circular buffer 'Keep One Slot Open' implementation for simplicity + mozilla::UniquePtr<ProfileEntry[]> mEntries; + + // Points to the next entry we will write to, which is also the one at which + // we need to stop reading. + int mWritePos; + + // Points to the entry at which we can start reading. + int mReadPos; + + // The number of entries in our buffer. + int mEntrySize; + + // How many times mWritePos has wrapped around. + uint32_t mGeneration; + + // Markers that marker entries in the buffer might refer to. + ProfilerMarkerLinkedList mStoredMarkers; +}; + +#endif |