LocalityGroup.java revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2003 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*
* ident "%Z%%M% %I% %E% SMI"
*
*/
package com.sun.solaris.service.locality;
import java.util.*;
import com.sun.solaris.service.pools.*;
/**
* A representation of an individual Locality Group. A Locality Group
* resides within a Locality Domain.
*/
public class LocalityGroup
{
/**
* The locality domain which contains this group.
*/
private LocalityDomain domain;
/**
* The C proxy id for this instance.
*/
private long id;
/**
* The parent group of this instance.
*/
private LocalityGroup parent;
/**
* The array of CPU IDs which are assigned to this instance.
*/
private int cpu_ids[];
/**
* The child groups of this instance.
*/
private Set children;
/**
* Constructor.
*
* @param domain is the domain to which this instance belongs.
* @param id is the id of this instance.
* @param parent is the parent of this instance.
*/
public LocalityGroup(LocalityDomain domain, long id,
LocalityGroup parent)
{
this.domain = domain;
this.id = id;
this.parent = parent;
this.cpu_ids = jl_cpus();
long nativeChildren[] = jl_children();
children = new HashSet();
for (int i = 0; i < nativeChildren.length; i++)
children.add(new LocalityGroup(domain,
nativeChildren[i], this));
}
/**
* Return a string representation of this instance.
*/
public String toString()
{
StringBuffer sb = new StringBuffer().append("locality group ")
.append(id)
.append(" with cpus [");
String sep = "";
for (int i = 0; i < cpu_ids.length; i++) {
sb.append(sep);
sb.append(cpu_ids[i]);
sep = " ";
}
sb.append("]");
return (sb.toString());
}
/**
* Return the set of child locality groups for this instance.
*/
public Set getChildren()
{
return (children);
}
/**
* Return the array of CPU IDs which belong to this locality
* group.
*/
public int[] getCPUIDs()
{
return (cpu_ids);
}
/**
* Return the locality group ID.
*/
long getID()
{
return (id);
}
/**
* Return the latency of the supplied group with respect to
* this group.
*
* @param other is another locality group belonging to the
* same LocalityDomain.
*/
public int getLatency(LocalityGroup other)
{
return (jl_latency(id, other.getID()));
}
/**
* Return the number of Latency Groups to which these cpus
* belong which are not part of this group.
*
* @param cpus List of cpus to be examined.
*
* @throws PoolsException if there is an error accessing the
* cpu details.
*/
public int countForeignGroups(List cpus) throws PoolsException
{
Set groups = new HashSet();
Iterator cpuIt = cpus.iterator();
while (cpuIt.hasNext()) {
Component comp = (Component) cpuIt.next();
int id = (int) comp.getLongProperty("cpu.sys_id");
for (int i = 0; i < cpu_ids.length; i++) {
if (cpu_ids[i] == id) {
LocalityGroup other = domain.
getGroup(id);
if (other != this &&
groups.contains(other) == false)
groups.add(other);
}
}
}
return (groups.size());
}
public Set contains(List cpus) throws PoolsException
{
Set contained = new HashSet();
Iterator cpuIt = cpus.iterator();
int set_cpus[] = getCPUIDs();
while (cpuIt.hasNext()) {
Component comp = (Component) cpuIt.next();
for (int i = 0; i < set_cpus.length; i++) {
if (set_cpus[i] == (int)comp.getLongProperty(
"cpu.sys_id")) {
contained.add(comp);
break;
}
}
}
return (contained);
}
/**
* Return an array containing the child locality group IDs.
*/
private native long[] jl_children();
/**
* Return an array of CPU IDs within this locality group.
*/
private native int[] jl_cpus();
/**
* Return the latency between the two supplied lgrp IDs.
*
* @param id1 is the first id.
* @param id2 is the second id.
*/
private native int jl_latency(long id1, long id2);
}