/*******************************************************************************
 * Copyright (c) 2004,2008 Red Hat, Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Keith Seitz <keiths@redhat.com> - initial API and implementation
 *    Kent Sebastian <ksebasti@redhat.com>
 *******************************************************************************/ 

package org.eclipse.linuxtools.internal.oprofile.core.daemon;

import org.eclipse.linuxtools.internal.oprofile.core.Oprofile;

/**
 * This class represents an event used to configure the OProfile
 * daemon.
 */
public class OprofileDaemonEvent {
	public static final int COUNT_UNINITIALIZED = 0;
	public static final int COUNT_INVALID = -1;
	
	/**
	 *  The event to collect on this counter
	 */
	private OpEvent event;
	
	/**
	 *  Boolean variable to enable/disable Profile kernel
	 */
	private boolean profileKernel;
	
	/**
	 *  Boolean variable to enable/disable Profile userspace
	 */
	private boolean profileUser;
	
	/**
	 *  Reset counter value
	 */
	private int count;

	public OprofileDaemonEvent() {
		profileKernel = true;
		profileUser = true;
		count = COUNT_UNINITIALIZED;
		event = null;
	}

	/**
	 * Set the event to collect
	 * @param event the OProfile event
	 */
	public void setEvent(OpEvent event) {
		this.event = event;
	}
	
	/**
	 * Get the event to collect
	 * @returns the OProfile event
	 */
	public OpEvent getEvent() {
		return event;
	}

	/**
	 * Set whether to profile the kernel
	 * @param profileKernel whether to enable kernel profiling
	 */
	public void setProfileKernel(boolean profileKernel) {
		this.profileKernel = profileKernel;
	}
	
	/**
	 * Get whether to profile the kernel
	 * @return whether to profile the kernel
	 */
	public boolean getProfileKernel() {
		return profileKernel;
	}

	/**
	 * Set whether to profile userspace
	 * @param profileUser whether to profile userspace
	 */
	public void setProfileUser(boolean profileUser) {
		this.profileUser = profileUser;
	}
	
	/**
	 * Get whether to profile userspace
	 * @return whether to profile userspace
	 */
	public boolean getProfileUser() {
		return profileUser;
	}

	/**
	 * Set the reset count
	 * @param count the new count
	 */
	public void setResetCount(int count) {
		this.count = count;
	}
	
	/**
	 * Get the reset count
	 * @return the reset count
	 */
	public int getResetCount() {
		// FIXME: This isn't quite in the right place...
		if (count == COUNT_UNINITIALIZED) {
			// This is what Oprofile does in oprof_start.cpp:
			double speed = Oprofile.getCpuFrequency();
			if (speed == 0.0) {
				count = event.getMinCount() * 30;
			} else {
				count = (int) speed * 20;
			}
		}
		
		return count;
	}
}
