/*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
*
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* This source code is provided to illustrate the usage of a given feature
* or technique and has been deliberately simplified. Additional steps
* required for a production-quality application, such as security checks,
* input validation and proper error handling, might not be present in
* this sample code.
*/
#include "hprof.h"
/* This file contains the cpu loop for the option cpu=samples */
/* The cpu_loop thread basically waits for gdata->sample_interval millisecs
* then wakes up, and for each running thread it gets their stack trace,
* and updates the traces with 'hits'.
*
* No threads are suspended or resumed, and the thread sampling is in the
* file hprof_tls.c, which manages all active threads. The sampling
* technique (what is sampled) is also in hprof_tls.c.
*
* No adjustments are made to the pause time or sample interval except
* by the user via the interval=n option (default is 10ms).
*
* This thread can cause havoc when started prematurely or not terminated
* properly, see cpu_sample_init() and cpu_term(), and their calls in hprof_init.c.
*
* The listener loop (hprof_listener.c) can dynamically turn on or off the
* sampling of all or selected threads.
*
*/
/* Private functions */
static void JNICALL
{
int loop_trip_counter;
loop_trip_counter = 0;
/* Notify cpu_sample_init() that we have started */
while ( cpu_loop_running ) {
/* If a dump is in progress, we pause sampling. */
if (gdata->dump_in_process) {
}
/* Check to see if we need to pause sampling (listener_loop command) */
if (gdata->pause_cpu_sampling) {
/*
* Pause sampling for now. Reset sample controls if
* sampling is resumed again.
*/
/* Continue the while loop, which will terminate if done. */
continue;
}
/* This is the normal short timed wait before getting a sample */
/* Make sure we really want to continue */
/* Break out if we are done */
if ( !cpu_loop_running ) {
break;
}
/*
* If a dump request came in after we checked at the top of
* the while loop, then we catch that fact here. We
* don't want to perturb the data that is being dumped so
* we just ignore the data from this sampling loop.
*/
if (gdata->dump_in_process) {
}
/* Sample all the threads and update trace costs */
if ( !gdata->pause_cpu_sampling) {
}
/* Check to see if we need to finish */
}
/* Notify cpu_sample_term() that we are done. */
}
/* External functions */
void
{
/* Create the raw monitors needed */
/* Wait for cpu_loop_function() to notify us it has started. */
}
void
{
count = 1;
if (object_index != 0) {
}
if ( count == 0 ) {
} else {
}
}
void
{
}
if (object_index == 0) {
} else {
if ( count > 0 ) {
}
}
/* Notify the CPU sampling thread that sampling is on */
}
void
{
/* Notify the CPU sampling thread to get out of any sampling Wait */
if ( gdata->cpu_loop_running ) {
/* Wait for cpu_loop_function() thread to tell us it completed. */
}
}