4ae67516a1d5dc4a5dbc761762bad5b596647388tomee/*
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * CDDL HEADER START
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee *
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * The contents of this file are subject to the terms of the
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * Common Development and Distribution License (the "License").
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * You may not use this file except in compliance with the License.
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee *
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * or http://www.opensolaris.org/os/licensing.
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * See the License for the specific language governing permissions
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * and limitations under the License.
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee *
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * When distributing Covered Code, include this CDDL HEADER in each
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * If applicable, add the following below this CDDL HEADER, with the
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * fields enclosed by brackets "[]" replaced with your own identifying
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * information: Portions Copyright [yyyy] [name of copyright owner]
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee *
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * CDDL HEADER END
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee */
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee/*
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * Use is subject to license terms.
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee */
4ae67516a1d5dc4a5dbc761762bad5b596647388tomeeimport java.util.*;
4ae67516a1d5dc4a5dbc761762bad5b596647388tomeeimport java.util.concurrent.atomic.*;
4ae67516a1d5dc4a5dbc761762bad5b596647388tomeeimport org.opensolaris.os.dtrace.*;
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee/**
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * Regression test for 6521523 aggregation drops can hang the Java
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * DTrace API.
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee */
4ae67516a1d5dc4a5dbc761762bad5b596647388tomeepublic class TestDrop {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee static final String PROGRAM =
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee "fbt:genunix::entry { @[execname, pid] = count(); }";
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee static AtomicLong consumerThreadID = new AtomicLong();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee static AtomicLong getAggregateThreadID = new AtomicLong();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee static AtomicBoolean done = new AtomicBoolean();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee static int seconds;
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee private static void
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee startTimer()
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee if (seconds <= 0) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee return;
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee final Timer timer = new Timer();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee timer.schedule(new TimerTask() {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee public void run() {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee done.set(true);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee timer.cancel();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }, seconds * 1000L);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee private static void
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee sampleAggregate(Consumer consumer) throws DTraceException
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee while (consumer.isRunning() && !done.get()) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee try {
4d0eb50e691de4c20b1dd9976ad6839fede8a42dRichard PALO Thread.sleep(50);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee } catch (InterruptedException e) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee consumer.getAggregate(Collections. <String> emptySet());
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee private static void
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee startAggregateThread(final Consumer consumer)
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee Runnable aggregateSampler = new Runnable() {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee public void run() {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee Thread t = Thread.currentThread();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee getAggregateThreadID.set(t.getId());
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee Throwable x = null;
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee try {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee sampleAggregate(consumer);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee } catch (Throwable e) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee x = e;
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee if (Thread.holdsLock(LocalConsumer.class)) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee if (x != null) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee x.printStackTrace();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee System.out.println("Lock held");
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee System.exit(1);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee } else {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee System.out.println("Lock released");
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee consumer.close(); // blocks if lock held
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee };
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee Thread t = new Thread(aggregateSampler, "Aggregate Sampler");
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee t.start();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee static void
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee usage()
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee System.err.println("usage: java TestDrop [ seconds ]");
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee System.exit(2);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee public static void
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee main(String[] args)
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee if (args.length == 1) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee try {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee seconds = Integer.parseInt(args[0]);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee } catch (NumberFormatException e) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee usage();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee } else if (args.length > 1) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee usage();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee final Consumer consumer = new LocalConsumer() {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee protected Thread createThread() {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee Runnable worker = new Runnable() {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee public void run() {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee Thread t = Thread.currentThread();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee consumerThreadID.set(t.getId());
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee work();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee };
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee Thread t = new Thread(worker);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee return t;
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee };
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee consumer.addConsumerListener(new ConsumerAdapter() {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee public void consumerStarted(ConsumerEvent e) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee startAggregateThread(consumer);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee startTimer();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee public void dataDropped(DropEvent e) throws ConsumerException {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee Thread t = Thread.currentThread();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee if (t.getId() == getAggregateThreadID.get()) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee Drop drop = e.getDrop();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee throw new ConsumerException(drop.getDefaultMessage(),
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee drop);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee });
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee try {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee consumer.open();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee consumer.setOption(Option.aggsize, Option.kb(1));
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee consumer.setOption(Option.aggrate, Option.millis(101));
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee consumer.compile(PROGRAM);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee consumer.enable();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee consumer.go(new ExceptionHandler() {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee public void handleException(Throwable e) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee e.printStackTrace();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee });
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee } catch (DTraceException e) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee e.printStackTrace();
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee}