Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / src / inferiorRPC.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: inferiorRPC.h,v 1.9 2004/03/23 01:12:03 eli Exp $
33  */
34
35 #ifndef _INFERIOR_RPC_H_
36 #define _INFERIOR_RPC_H_
37
38 #include "common/h/Types.h"
39
40 class AstNode;
41 class dyn_thread;
42 class process;
43 class dyn_lwp;
44 struct dyn_saved_regs;
45
46 // RPC state enumerated type
47 typedef enum { irpcNotValid, irpcNotRunning, irpcRunning, irpcWaitingForTrap,
48                irpcNotReadyForIRPC } irpcState_t;
49
50 // RPC launch return type
51 typedef enum { irpcNoIRPC, irpcStarted, irpcAgain, irpcTrapSet, 
52                irpcError } irpcLaunchState_t;
53
54 // inferior RPC callback function type
55 typedef void(*inferiorRPCcallbackFunc)(process *p, unsigned rpcid, void *data,
56                                        void *result);
57
58
59 class rpcLwp;
60
61 struct inferiorRPCtoDo {  
62    AstNode *action;
63    bool noCost; // if true, cost model isn't updated by generated code.
64    inferiorRPCcallbackFunc callbackFunc;
65    void *userData;
66    bool lowmem; /* set to true when the inferior is low on memory */
67    rpcLwp *rpclwp;
68    unsigned seq_num;
69    irpcState_t irpcState_;
70   // if DYNINSTinit, we launch it as regular RPC
71   // otherwise launch it as MT RPC
72 };
73
74
75 struct inferiorRPCinProgress {
76   // This structure keeps track of a launched inferiorRPC which we're
77   // waiting to complete.  Don't confuse with 'inferiorRPCtoDo', 
78   // which is more of a wait queue of RPCs to start launching.
79   // Also note: It's only safe for 1 (one) RPC to be in progress at a time.
80   // If you _really_ want to launch multiple RPCs at the same time, it's
81   // actually easy to do...just do one inferiorRPC with a sequenceNode AST!
82   // (Admittedly, that confuses the semantics of callback functions.  So the
83   // official line remains: only 1 inferior RPC per process can be ongoing.)
84   inferiorRPCcallbackFunc callbackFunc;
85   void *userData;
86   
87   struct dyn_saved_regs *savedRegs; // crucial!
88   
89   Address origPC;
90   
91   bool wasRunning; // were we running when we launched the inferiorRPC?
92   
93   Address firstInstrAddr; // start location of temp tramp
94   
95   Address stopForResultAddr;
96   // location of TRAP or ILL which marks point where paradynd should grab
97   // the result register.  Undefined if no callback fn.
98   Address justAfter_stopForResultAddr; // undefined if no callback fn.
99   Register resultRegister; // undefined if no callback fn.
100   
101   void *resultValue; // undefined until we stop-for-result, at which time we
102   // fill this in.  callback fn (which takes this value)
103   // isn't invoked until breakAddr (the final break)
104   
105   Address breakAddr; // location of TRAP or ILL insn which 
106   // marks the end of the inferiorRPC
107   
108   bool isSafeRPC ;   // was run as a "run later" funclet
109   rpcLwp *rpclwp;      // Target the RPC to a specific kernel thread?
110   unsigned seq_num;
111 };
112
113
114
115 #endif