author Nicholas Nethercote <>
Fri, 03 Mar 2017 15:32:11 +1100
changeset 374836 4e196d802c7be7f3a3c147cc6c5b6406656584b1
parent 322797 93d5271f033292f898407d8cb1a1a80721a0ab5d
permissions -rw-r--r--
Bug 1344118 - Fix the profiler's sleeping threads optimization. r=jseward. When ProfilerBuffer::reset() is called, DuplicateLastSample() will start failing for all sleeping threads because there will be no prior thread data in the buffer to duplicate. But the sampling loop doesn't detect such failure. This causes two problems: - Missing samples. - CPU usage goes through the roof, because each time around the sampling loop the length of the failing search increases. The fix is simple: detect failure in the sampling loop and do a normal sample in that case. The patch also removes ThreadInfo::DuplicateLastSample(), because it just calls onto ProfileBuffer::DuplicateLastSample().

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 */

#ifndef mozilla_dom_HTMLMetaElement_h
#define mozilla_dom_HTMLMetaElement_h

#include "mozilla/Attributes.h"
#include "nsGenericHTMLElement.h"
#include "nsIDOMHTMLMetaElement.h"

namespace mozilla {
namespace dom {

class HTMLMetaElement final : public nsGenericHTMLElement,
                              public nsIDOMHTMLMetaElement
  explicit HTMLMetaElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo);

  // nsISupports

  // nsIDOMHTMLMetaElement

  virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
                              nsIContent* aBindingParent,
                              bool aCompileEventHandlers) override;
  virtual void UnbindFromTree(bool aDeep = true,
                              bool aNullParent = true) override;

  virtual nsresult AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
                                const nsAttrValue* aValue, bool aNotify) override;

  void CreateAndDispatchEvent(nsIDocument* aDoc, const nsAString& aEventName);

  virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const override;

  // XPCOM GetName is fine.
  void SetName(const nsAString& aName, ErrorResult& aRv)
    SetHTMLAttr(nsGkAtoms::name, aName, aRv);
  // XPCOM GetHttpEquiv is fine.
  void SetHttpEquiv(const nsAString& aHttpEquiv, ErrorResult& aRv)
    SetHTMLAttr(nsGkAtoms::httpEquiv, aHttpEquiv, aRv);
  // XPCOM GetContent is fine.
  void SetContent(const nsAString& aContent, ErrorResult& aRv)
    SetHTMLAttr(nsGkAtoms::content, aContent, aRv);
  // XPCOM GetScheme is fine.
  void SetScheme(const nsAString& aScheme, ErrorResult& aRv)
    SetHTMLAttr(nsGkAtoms::scheme, aScheme, aRv);

  virtual JSObject* WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;

  virtual ~HTMLMetaElement();

  nsresult SetMetaReferrer(nsIDocument* aDocument);

} // namespace dom
} // namespace mozilla

#endif // mozilla_dom_HTMLMetaElement_h