filter.c   [plain text]


/*
 * Copyright (c) 2011 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
 * 
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. The rights granted to you under the License
 * may not be used to create, or enable the creation or redistribution of,
 * unlawful or unlicensed copies of an Apple operating system, or to
 * circumvent, violate, or enable the circumvention or violation of, any
 * terms of an Apple operating system software license agreement.
 * 
 * Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 * 
 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
 */

/*  Toy filtering. Allow system-wide or filtering on 4 PIDs */

#include <mach/mach_types.h>
#include <sys/types.h> /* NULL */
// #include <libkern/libkern.h>

#include <kperf/context.h>
#include <kperf/filter.h>

// Filter params... dodge for now
#define NPIDS (4)
int pid_list[NPIDS];

// function to determine whether we should take a sample
int
kperf_filter_should_sample(struct kperf_context *context)
{
	int i, restricted = 0;

	/* see if the pids are restricted */
	for( i = 0; i < NPIDS; i++ )
	{
		if( context->cur_pid == pid_list[i] )
			return 1;

		if( pid_list[i] != -1 )
			restricted = 1;
	}

	/* wasn't in the pid list, but something was */
	if( restricted )
		return 0;

	/* not fitered, sample it */
	return 1;
}

/* check whether pid filtering is enabled */
int
kperf_filter_on_pid(void)
{
	int i;

	for( i = 0; i < NPIDS; i++ )
		if( pid_list[i] != -1 )
			return 1;

	return 0;
}

/* create a list of pids to filter */
void
kperf_filter_pid_list( int *outcount, int **outv )
{
	int i, found = 0;

	for( i = 0; i < NPIDS; i++ )
		if( pid_list[i] != -1 )
			found = 1;

	if( !found )
	{
		*outcount = 0;
		*outv = NULL;
		return;
	}

	/* just return our list */
	*outcount = NPIDS;
	*outv = pid_list;
}

/* free a list we created*/
void
kperf_filter_free_pid_list( int *incount, int **inv )
{
	// no op
	(void) incount;
	(void) inv;
}

/* init the filters to nothing */
void
kperf_filter_init(void)
{
	int i;
	for( i = 0; i < NPIDS; i++ )
		pid_list[i] = -1;
}