Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / src / signalgenerator-winnt.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-winnt.h,v 1.10 2008/04/15 16:43:32 roundy Exp $
33  */
34
35 #ifndef _SIGNAL_GENERATOR_WINNT_H
36 #define _SIGNAL_GENERATOR_WINNT_H
37
38 #include <string>
39
40 // Normally included automatically in signalgenerator.h
41
42 ///////////////////////////////////////////////////////////////////
43 ////////// Handler section
44 ///////////////////////////////////////////////////////////////////
45
46 // These are the prototypes for the NT-style signal handler
47 // NT has a two-level continue mechanism which we have to handle.
48 // There is a process-wide debug pause/resume, and a per-thread flag
49 // to pause or resume. We use the per-thread for pause() and continueProc(),
50 // and the process-wide for debug events. The process is stopped when
51 // the signal handler executes, and is re-run at the end. If the process
52 // should stay stopped the handlers must pause it explicitly.
53
54
55 class SignalGenerator : public SignalGeneratorCommon
56 {
57   friend class SignalHandler;
58   friend class SignalGeneratorCommon;
59   friend class process;
60
61   public:
62    virtual ~SignalGenerator() {}
63
64    HANDLE getProcessHandle() {return (HANDLE)procHandle;}
65    HANDLE getThreadHandle() {return (HANDLE)thrHandle;}
66   SignalGenerator(char *idstr, std::string file, std::string dir,
67                          pdvector<std::string> *argv,
68                          pdvector<std::string> *envp,
69                          std::string inputFile,
70                          std::string outputFile,
71                          int stdin_fd, int stdout_fd,
72                          int stderr_fd);
73
74   SignalGenerator(char *idstr, std::string file, int pid);
75
76    bool waitingForStop() {return false;}
77    void setWaitingForStop(bool flag) {;}
78
79   bool SuspendThreadFromEvent(LPDEBUG_EVENT ev, dyn_lwp *lwp);
80   private:
81   SignalHandler *newSignalHandler(char *name, int id);
82   virtual bool forkNewProcess();
83   virtual bool attachProcess();
84   virtual bool waitForStopInline();
85   bool waitNextEventInternal(EventRecord &);
86   bool waitForEventsInternal(pdvector<EventRecord> &events);
87   virtual bool decodeEvents(pdvector<EventRecord> &events);
88
89   bool decodeEvent(EventRecord &event);
90   bool decodeBreakpoint(EventRecord &);
91   bool decodeException(EventRecord &);
92   virtual bool decodeSyscall(EventRecord &ev);
93
94   int procHandle;
95   int thrHandle;
96   bool waiting_for_stop;
97 };
98
99 #endif