001 // This file is part of the program FRYSK. 002 // 003 // Copyright 2005, 2006, 2007, 2008, Red Hat Inc. 004 // 005 // FRYSK is free software; you can redistribute it and/or modify it 006 // under the terms of the GNU General Public License as published by 007 // the Free Software Foundation; version 2 of the License. 008 // 009 // FRYSK is distributed in the hope that it will be useful, but 010 // WITHOUT ANY WARRANTY; without even the implied warranty of 011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 012 // General Public License for more details. 013 // 014 // You should have received a copy of the GNU General Public License 015 // along with FRYSK; if not, write to the Free Software Foundation, 016 // Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. 017 // 018 // In addition, as a special exception, Red Hat, Inc. gives You the 019 // additional right to link the code of FRYSK with code not covered 020 // under the GNU General Public License ("Non-GPL Code") and to 021 // distribute linked combinations including the two, subject to the 022 // limitations in this paragraph. Non-GPL Code permitted under this 023 // exception must only link to the code of FRYSK through those well 024 // defined interfaces identified in the file named EXCEPTION found in 025 // the source code files (the "Approved Interfaces"). The files of 026 // Non-GPL Code may instantiate templates or use macros or inline 027 // functions from the Approved Interfaces without causing the 028 // resulting work to be covered by the GNU General Public 029 // License. Only Red Hat, Inc. may make changes or additions to the 030 // list of Approved Interfaces. You must obey the GNU General Public 031 // License in all respects for all of the FRYSK code and other code 032 // used in conjunction with FRYSK except the Non-GPL Code covered by 033 // this exception. If you modify this file, you may extend this 034 // exception to your version of the file, but you are not obligated to 035 // do so. If you do not wish to provide this exception without 036 // modification, you must delete this exception statement from your 037 // version and license this file solely under the GPL without 038 // exception. 039 040 package frysk.testbed; 041 042 import frysk.isa.signals.Signal; 043 import frysk.proc.Action; 044 import frysk.proc.TaskObserver; 045 import frysk.proc.Task; 046 import frysk.proc.Manager; 047 import java.io.File; 048 import frysk.sys.ProcessIdentifier; 049 import frysk.sys.ProcessIdentifierFactory; 050 051 /** 052 * Creates an attached process that is blocked at a signal. 053 */ 054 public class DaemonBlockedAtSignal extends Offspring { 055 private final Task mainTask; 056 public ProcessIdentifier getPid() { 057 return ProcessIdentifierFactory.create(mainTask.getTid()); 058 } 059 060 private class RunToSignal extends TaskObserverBase 061 implements TaskObserver.Signaled, TaskObserver.Terminated 062 { 063 public Action updateSignaled(Task task, Signal value) { 064 Manager.eventLoop.requestStop(); 065 return Action.BLOCK; 066 } 067 public Action updateTerminated(Task task, Signal sig, int value) { 068 throw new RuntimeException("Program Exited."); 069 } 070 } 071 072 private DaemonBlockedAtSignal(DaemonBlockedAtEntry daemon) { 073 mainTask = daemon.getMainTask(); 074 // Allow it to run through to a crash. 075 RunToSignal sig = new RunToSignal(); 076 mainTask.requestAddSignaledObserver (sig); 077 mainTask.requestAddTerminatedObserver (sig); 078 daemon.requestRemoveBlock(); 079 TestLib.assertRunUntilStop("Run to crash"); 080 } 081 public DaemonBlockedAtSignal(String[] process) { 082 // Get the target program started and blocked at entry point. 083 this(new DaemonBlockedAtEntry(process)); 084 } 085 086 public DaemonBlockedAtSignal(String program) { 087 this(new DaemonBlockedAtEntry(program)); 088 } 089 090 public DaemonBlockedAtSignal(File exe) { 091 this(new DaemonBlockedAtEntry(exe)); 092 } 093 094 public Task getMainTask () { 095 return this.mainTask; 096 } 097 }