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

/*
 * Functions for controlling profilers from within JS: Valgrind, Perf,
 * Shark, etc.
 */
#ifndef builtin_Profilers_h
#define builtin_Profilers_h

#include "jstypes.h"

#ifdef _MSC_VER
typedef int pid_t;
#else
#include <unistd.h>
#endif

/**
 * Start any profilers that are available and have been configured on for this
 * platform. This is NOT thread safe.
 *
 * The profileName is used by some profilers to describe the current profiling
 * run. It may be used for part of the filename of the output, but the
 * specifics depend on the profiler. Many profilers will ignore it. Passing in
 * nullptr is legal; some profilers may use it to output to stdout or similar.
 *
 * Returns true if no profilers fail to start.
 */
extern JS_PUBLIC_API(bool)
JS_StartProfiling(const char* profileName, pid_t pid);

/**
 * Stop any profilers that were previously started with JS_StartProfiling.
 * Returns true if no profilers fail to stop.
 */
extern JS_PUBLIC_API(bool)
JS_StopProfiling(const char* profileName);

/**
 * Write the current profile data to the given file, if applicable to whatever
 * profiler is being used.
 */
extern JS_PUBLIC_API(bool)
JS_DumpProfile(const char* outfile, const char* profileName);

/**
 * Pause currently active profilers (only supported by some profilers). Returns
 * whether any profilers failed to pause. (Profilers that do not support
 * pause/resume do not count.)
 */
extern JS_PUBLIC_API(bool)
JS_PauseProfilers(const char* profileName);

/**
 * Resume suspended profilers
 */
extern JS_PUBLIC_API(bool)
JS_ResumeProfilers(const char* profileName);

/**
 * The profiling API calls are not able to report errors, so they use a
 * thread-unsafe global memory buffer to hold the last error encountered. This
 * should only be called after something returns false.
 */
JS_PUBLIC_API(const char*)
JS_UnsafeGetLastProfilingError();

#ifdef MOZ_CALLGRIND

extern JS_FRIEND_API(bool)
js_StopCallgrind();

extern JS_FRIEND_API(bool)
js_StartCallgrind();

extern JS_FRIEND_API(bool)
js_DumpCallgrind(const char* outfile);

#endif /* MOZ_CALLGRIND */

#ifdef __linux__

extern JS_FRIEND_API(bool)
js_StartPerf();

extern JS_FRIEND_API(bool)
js_StopPerf();

#endif /* __linux__ */

#endif /* builtin_Profilers_h */
