Home | History | Annotate | Download | only in interface
      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