Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / src / signalgenerator-unix.h
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 /* $Id: signalgenerator-unix.h,v 1.17 2008/04/15 16:43:31 roundy Exp $
33  */
34
35
36 #ifndef _SIGNAL_GENERATOR_UNIX_H_
37 #define _SIGNAL_GENERATOR_UNIX_H_
38
39 #include <string>
40 #include "dyninstAPI/src/os.h"
41
42 class Frame;
43
44 class SignalGenerator : public SignalGeneratorCommon
45 {
46   friend class SignalHandler;
47   friend class SignalGeneratorCommon;
48   friend class process;
49   
50   public:
51   virtual ~SignalGenerator();
52
53    bool checkForExit(EventRecord &ev, bool block =false);
54
55    bool waitingForStop() {return waiting_for_stop;}
56    void setWaitingForStop(bool flag) {waiting_for_stop = flag;}
57    void expectFakeSignal() {expect_fake_signal = true;}
58   private:
59   //  SignalGenerator should only be constructed by process
60   SignalGenerator(char *idstr, std::string file, std::string dir,
61                   pdvector<std::string> *argv,
62                   pdvector<std::string> *envp,
63                   std::string inputFile,
64                   std::string outputFile,
65                   int stdin_fd, int stdout_fd,
66                   int stderr_fd);
67
68   SignalGenerator(char *idstr, std::string file, int pid);
69
70   virtual SignalHandler *newSignalHandler(char *name, int id);
71
72   virtual bool forkNewProcess();
73   virtual bool attachProcess();
74   virtual bool waitForStopInline();
75   virtual bool decodeEvents(pdvector<EventRecord> &events);
76   virtual bool waitForEventsInternal(pdvector<EventRecord> &events);
77
78   //  decodeSignal_NP is called by decodeSignal before decodeSignal does any
79   //  decoding.  It allows platform specific actions to be taken for signal
80   //  decoding.  If it returns true, decodeSignal assumes that a valid decode 
81   //  has taken place and it  will not do any further decoding.
82   bool decodeSignal_NP(EventRecord &ev);
83   bool decodeSignal(EventRecord &ev);
84   bool decodeSigTrap(EventRecord &ev);
85   bool decodeSigStopNInt(EventRecord &ev);
86   bool decodeSigIll(EventRecord &ev);
87   bool isInstTrap(const EventRecord &ev, const Frame &af);
88
89   //  decodeSyscall changes the field ev.what from a platform specific
90   //  syscall representation, eg, SYS_fork, to a platform indep. one,
91   //  eg. procSysFork.  returns false if there is no available mapping.
92   virtual bool decodeSyscall(EventRecord &ev);
93
94 #if !defined (os_linux) 
95    bool decodeProcStatus(procProcStatus_t status, EventRecord &ev);
96 #endif
97
98    bool waiting_for_stop;
99
100    bool expect_fake_signal;
101
102 #if defined (os_linux)
103    public:
104    bool attachToChild(int pid);
105    bool registerLWP(int lwpid) { return waitpid_mux.registerLWP(lwpid, this);}
106    bool unregisterLWP(int lwpid) { return waitpid_mux.unregisterLWP(lwpid, this);}
107    bool add_lwp_to_poll_list(dyn_lwp *lwp);
108    bool remove_lwp_from_poll_list(int lwp_id);
109    bool resendSuppressedSignals();
110    bool exists_dead_lwp();
111    bool forceWaitpidReturn() {waitpid_mux.forceWaitpidReturn(); return true;}
112    bool pauseAllWaitpid() { return waitpid_mux.suppressWaitpidActivity();}
113    bool resumeWaitpid() { return waitpid_mux.resumeWaitpidActivity();}
114
115
116    pdvector<waitpid_ret_pair> event_queue;
117  private:
118    static WaitpidMux waitpid_mux;
119
120    pdvector<int> suppressed_sigs;
121    pdvector<dyn_lwp *> suppressed_lwps;
122    //  SignalHandler::suppressSignalWhenStopping
123    //  needed on linux platforms.  Allows the signal handler function
124    //  to ignore most non SIGSTOP signals when waiting for a process to stop
125    //  Returns true if signal is to be suppressed.
126    bool suppressSignalWhenStopping(EventRecord &ev);
127    //  SignalHandler::resendSuppressedSignals
128    //  called upon receipt of a SIGSTOP.  Sends all deferred signals to the stopped process.
129    int find_dead_lwp();
130    pdvector<int> attached_lwp_ids;
131  public:
132    pid_t waitpid_kludge(pid_t, int *, int, int *);
133 #endif
134
135 };
136
137 #endif