• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- SWIG Interface for SBEvent ------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 namespace lldb {
11 
12 class SBBroadcaster;
13 
14 %feature("docstring",
15 "API clients can register to receive events.
16 
17 For example, check out the following output:
18 
19 Try wait for event...
20 Event description: 0x103d0bb70 Event: broadcaster = 0x1009c8410, type = 0x00000001, data = { process = 0x1009c8400 (pid = 21528), state = running}
21 Event data flavor: Process::ProcessEventData
22 Process state: running
23 
24 Try wait for event...
25 Event description: 0x103a700a0 Event: broadcaster = 0x1009c8410, type = 0x00000001, data = { process = 0x1009c8400 (pid = 21528), state = stopped}
26 Event data flavor: Process::ProcessEventData
27 Process state: stopped
28 
29 Try wait for event...
30 Event description: 0x103d0d4a0 Event: broadcaster = 0x1009c8410, type = 0x00000001, data = { process = 0x1009c8400 (pid = 21528), state = exited}
31 Event data flavor: Process::ProcessEventData
32 Process state: exited
33 
34 Try wait for event...
35 timeout occurred waiting for event...
36 
37 from test/python_api/event/TestEventspy:
38 
39     def do_listen_for_and_print_event(self):
40         '''Create a listener and use SBEvent API to print the events received.'''
41         exe = os.path.join(os.getcwd(), 'a.out')
42 
43         # Create a target by the debugger.
44         target = self.dbg.CreateTarget(exe)
45         self.assertTrue(target, VALID_TARGET)
46 
47         # Now create a breakpoint on main.c by name 'c'.
48         breakpoint = target.BreakpointCreateByName('c', 'a.out')
49 
50         # Now launch the process, and do not stop at the entry point.
51         process = target.LaunchSimple(None, None, os.getcwd())
52         self.assertTrue(process.GetState() == lldb.eStateStopped,
53                         PROCESS_STOPPED)
54 
55         # Get a handle on the process's broadcaster.
56         broadcaster = process.GetBroadcaster()
57 
58         # Create an empty event object.
59         event = lldb.SBEvent()
60 
61         # Create a listener object and register with the broadcaster.
62         listener = lldb.SBListener('my listener')
63         rc = broadcaster.AddListener(listener, lldb.SBProcess.eBroadcastBitStateChanged)
64         self.assertTrue(rc, 'AddListener successfully retruns')
65 
66         traceOn = self.TraceOn()
67         if traceOn:
68             lldbutil.print_stacktraces(process)
69 
70         # Create MyListeningThread class to wait for any kind of event.
71         import threading
72         class MyListeningThread(threading.Thread):
73             def run(self):
74                 count = 0
75                 # Let's only try at most 4 times to retrieve any kind of event.
76                 # After that, the thread exits.
77                 while not count > 3:
78                     if traceOn:
79                         print 'Try wait for event...'
80                     if listener.WaitForEventForBroadcasterWithType(5,
81                                                                    broadcaster,
82                                                                    lldb.SBProcess.eBroadcastBitStateChanged,
83                                                                    event):
84                         if traceOn:
85                             desc = lldbutil.get_description(event)
86                             print 'Event description:', desc
87                             print 'Event data flavor:', event.GetDataFlavor()
88                             print 'Process state:', lldbutil.state_type_to_str(process.GetState())
89                             print
90                     else:
91                         if traceOn:
92                             print 'timeout occurred waiting for event...'
93                     count = count + 1
94                 return
95 
96         # Let's start the listening thread to retrieve the events.
97         my_thread = MyListeningThread()
98         my_thread.start()
99 
100         # Use Python API to continue the process.  The listening thread should be
101         # able to receive the state changed events.
102         process.Continue()
103 
104         # Use Python API to kill the process.  The listening thread should be
105         # able to receive the state changed event, too.
106         process.Kill()
107 
108         # Wait until the 'MyListeningThread' terminates.
109         my_thread.join()
110 ") SBEvent;
111 class SBEvent
112 {
113 public:
114     SBEvent();
115 
116     SBEvent (const lldb::SBEvent &rhs);
117 
118     %feature("autodoc",
119     "__init__(self, int type, str data) -> SBEvent (make an event that contains a C string)"
120     ) SBEvent;
121     SBEvent (uint32_t event, const char *cstr, uint32_t cstr_len);
122 
123     ~SBEvent();
124 
125     bool
126     IsValid() const;
127 
128     const char *
129     GetDataFlavor ();
130 
131     uint32_t
132     GetType () const;
133 
134     lldb::SBBroadcaster
135     GetBroadcaster () const;
136 
137     const char *
138     GetBroadcasterClass () const;
139 
140     bool
141     BroadcasterMatchesRef (const lldb::SBBroadcaster &broadcaster);
142 
143     void
144     Clear();
145 
146     static const char *
147     GetCStringFromEvent (const lldb::SBEvent &event);
148 
149     bool
150     GetDescription (lldb::SBStream &description) const;
151 };
152 
153 } // namespace lldb
154