[Lldb-commits] [lldb] r134766 - in /lldb/trunk: include/lldb/API/SBEvent.h include/lldb/API/SBListener.h scripts/lldb.swig test/python_api/default-constructor/TestDefaultConstructorForAPIObjects.py test/python_api/event/TestEvents.py

Johnny Chen johnny.chen at apple.com
Fri Jul 8 16:02:33 PDT 2011


Author: johnny
Date: Fri Jul  8 18:02:33 2011
New Revision: 134766

URL: http://llvm.org/viewvc/llvm-project?rev=134766&view=rev
Log:
o TestEvents.py:

Add a usage example of SBEvent APIs.

o SBEvent.h and SBListener.h:

Add method docstrings for SBEvent.h and SBListener.h, and example usage of SBEvent into
the class docstring of SBEvent.

o lldb.swig:

Add typemap for SBEvent::SBEvent (uint32_t event, const char *cstr, uint32_t cstr_len)
so that we can use, in Python, obj2 = lldb.SBEvent(0, "abc") to create an SBEvent.

Modified:
    lldb/trunk/include/lldb/API/SBEvent.h
    lldb/trunk/include/lldb/API/SBListener.h
    lldb/trunk/scripts/lldb.swig
    lldb/trunk/test/python_api/default-constructor/TestDefaultConstructorForAPIObjects.py
    lldb/trunk/test/python_api/event/TestEvents.py

Modified: lldb/trunk/include/lldb/API/SBEvent.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBEvent.h?rev=134766&r1=134765&r2=134766&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBEvent.h (original)
+++ lldb/trunk/include/lldb/API/SBEvent.h Fri Jul  8 18:02:33 2011
@@ -20,18 +20,124 @@
 
 class SBBroadcaster;
 
+#ifdef SWIG
+%feature("docstring",
+"API clients can register to receive events.
+
+For example, check out the following output:
+
+Try wait for event...
+Event description: 0x103d0bb70 Event: broadcaster = 0x1009c8410, type = 0x00000001, data = { process = 0x1009c8400 (pid = 21528), state = running}
+Event data flavor: Process::ProcessEventData
+Process state: running
+
+Try wait for event...
+Event description: 0x103a700a0 Event: broadcaster = 0x1009c8410, type = 0x00000001, data = { process = 0x1009c8400 (pid = 21528), state = stopped}
+Event data flavor: Process::ProcessEventData
+Process state: stopped
+
+Try wait for event...
+Event description: 0x103d0d4a0 Event: broadcaster = 0x1009c8410, type = 0x00000001, data = { process = 0x1009c8400 (pid = 21528), state = exited}
+Event data flavor: Process::ProcessEventData
+Process state: exited
+
+Try wait for event...
+timeout occurred waiting for event...
+
+from test/python_api/event/TestEventspy:
+
+    def do_listen_for_and_print_event(self):
+        '''Create a listener and use SBEvent API to print the events received.'''
+        exe = os.path.join(os.getcwd(), 'a.out')
+
+        # Create a target by the debugger.
+        target = self.dbg.CreateTarget(exe)
+        self.assertTrue(target, VALID_TARGET)
+
+        # Now create a breakpoint on main.c by name 'c'.
+        breakpoint = target.BreakpointCreateByName('c', 'a.out')
+
+        # Now launch the process, and do not stop at the entry point.
+        process = target.LaunchSimple(None, None, os.getcwd())
+        self.assertTrue(process.GetState() == lldb.eStateStopped,
+                        PROCESS_STOPPED)
+
+        # Get a handle on the process's broadcaster.
+        broadcaster = process.GetBroadcaster()
+
+        # Create an empty event object.
+        event = lldb.SBEvent()
+
+        # Create a listener object and register with the broadcaster.
+        listener = lldb.SBListener('my listener')
+        rc = broadcaster.AddListener(listener, lldb.SBProcess.eBroadcastBitStateChanged)
+        self.assertTrue(rc, 'AddListener successfully retruns')
+
+        traceOn = self.TraceOn()
+        if traceOn:
+            lldbutil.print_stacktraces(process)
+
+        # Create MyListeningThread class to wait for any kind of event.
+        import threading
+        class MyListeningThread(threading.Thread):
+            def run(self):
+                count = 0
+                # Let's only try at most 4 times to retrieve any kind of event.
+                # After that, the thread exits.
+                while not count > 3:
+                    if traceOn:
+                        print 'Try wait for event...'
+                    if listener.WaitForEventForBroadcasterWithType(5,
+                                                                   broadcaster,
+                                                                   lldb.SBProcess.eBroadcastBitStateChanged,
+                                                                   event):
+                        if traceOn:
+                            desc = lldbutil.get_description(event)
+                            print 'Event description:', desc
+                            print 'Event data flavor:', event.GetDataFlavor()
+                            print 'Process state:', lldbutil.state_type_to_str(process.GetState())
+                            print
+                    else:
+                        if traceOn:
+                            print 'timeout occurred waiting for event...'
+                    count = count + 1
+                return
+
+        # Let's start the listening thread to retrieve the events.
+        my_thread = MyListeningThread()
+        my_thread.start()
+
+        # Use Python API to continue the process.  The listening thread should be
+        # able to receive the state changed events.
+        process.Continue()
+
+        # Use Python API to kill the process.  The listening thread should be
+        # able to receive the state changed event, too.
+        process.Kill()
+
+        # Wait until the 'MyListeningThread' terminates.
+        my_thread.join()
+"
+         ) SBEvent;
+#endif
 class SBEvent
 {
+#ifdef SWIG
+    %feature("autodoc", "1");
+#endif
 public:
     SBEvent();
 
+    SBEvent (const lldb::SBEvent &rhs);
+    
     // Make an event that contains a C string.
+#ifdef SWIG
+    %feature("autodoc", "__init__(self, int type, str data) -> SBEvent") SBEvent;
+#endif
     SBEvent (uint32_t event, const char *cstr, uint32_t cstr_len);
 
     ~SBEvent();
 
-    SBEvent (const lldb::SBEvent &rhs);
-    
 #ifndef SWIG
     const SBEvent &
     operator = (const lldb::SBEvent &rhs);

Modified: lldb/trunk/include/lldb/API/SBListener.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBListener.h?rev=134766&r1=134765&r2=134766&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBListener.h (original)
+++ lldb/trunk/include/lldb/API/SBListener.h Fri Jul  8 18:02:33 2011
@@ -16,6 +16,9 @@
 
 class SBListener
 {
+#ifdef SWIG
+    %feature("autodoc", "1");
+#endif
 public:
     SBListener ();
 

Modified: lldb/trunk/scripts/lldb.swig
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/lldb.swig?rev=134766&r1=134765&r2=134766&view=diff
==============================================================================
--- lldb/trunk/scripts/lldb.swig (original)
+++ lldb/trunk/scripts/lldb.swig Fri Jul  8 18:02:33 2011
@@ -102,7 +102,16 @@
 
 
 // typemap for an outgoing buffer
-// See also SBProcess::WriteMemory.
+// See also SBEvent::SBEvent(uint32_t event, const char *cstr, uint32_t cstr_len).
+%typemap(in) (const char *cstr, uint32_t cstr_len) {
+   if (!PyString_Check($input)) {
+       PyErr_SetString(PyExc_ValueError, "Expecting a string");
+       return NULL;
+   }
+   $1 = (char *) PyString_AsString($input);
+   $2 = PyString_Size($input);
+}
+// And SBProcess::WriteMemory.
 %typemap(in) (const void *buf, size_t size) {
    if (!PyString_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting a string");

Modified: lldb/trunk/test/python_api/default-constructor/TestDefaultConstructorForAPIObjects.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/default-constructor/TestDefaultConstructorForAPIObjects.py?rev=134766&r1=134765&r2=134766&view=diff
==============================================================================
--- lldb/trunk/test/python_api/default-constructor/TestDefaultConstructorForAPIObjects.py (original)
+++ lldb/trunk/test/python_api/default-constructor/TestDefaultConstructorForAPIObjects.py Fri Jul  8 18:02:33 2011
@@ -118,6 +118,7 @@
     @python_api_test
     def test_SBEvent(self):
         obj = lldb.SBEvent()
+        obj2 = lldb.SBEvent(0, "abc")
         if self.TraceOn():
             print obj
         self.assertFalse(obj)

Modified: lldb/trunk/test/python_api/event/TestEvents.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/event/TestEvents.py?rev=134766&r1=134765&r2=134766&view=diff
==============================================================================
--- lldb/trunk/test/python_api/event/TestEvents.py (original)
+++ lldb/trunk/test/python_api/event/TestEvents.py Fri Jul  8 18:02:33 2011
@@ -14,6 +14,19 @@
 
     @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
     @python_api_test
+    def test_listen_for_and_print_event_with_dsym(self):
+        """Exercise SBEvent API."""
+        self.buildDsym()
+        self.do_listen_for_and_print_event()
+
+    @python_api_test
+    def test_listen_for_and_print_event_with_dwarf(self):
+        """Exercise SBEvent API."""
+        self.buildDwarf()
+        self.do_listen_for_and_print_event()
+
+    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
+    @python_api_test
     def test_wait_for_event_with_dsym(self):
         """Exercise SBListener.WaitForEvent() API."""
         self.buildDsym()
@@ -44,6 +57,78 @@
         # Find the line number to of function 'c'.
         self.line = line_number('main.c', '// Find the line number of function "c" here.')
 
+    def do_listen_for_and_print_event(self):
+        """Create a listener and use SBEvent API to print the events received."""
+        exe = os.path.join(os.getcwd(), "a.out")
+
+        # Create a target by the debugger.
+        target = self.dbg.CreateTarget(exe)
+        self.assertTrue(target, VALID_TARGET)
+
+        # Now create a breakpoint on main.c by name 'c'.
+        breakpoint = target.BreakpointCreateByName('c', 'a.out')
+
+        # Now launch the process, and do not stop at the entry point.
+        process = target.LaunchSimple(None, None, os.getcwd())
+        self.assertTrue(process.GetState() == lldb.eStateStopped,
+                        PROCESS_STOPPED)
+
+        # Get a handle on the process's broadcaster.
+        broadcaster = process.GetBroadcaster()
+
+        # Create an empty event object.
+        event = lldb.SBEvent()
+
+        # Create a listener object and register with the broadcaster.
+        listener = lldb.SBListener("my listener")
+        rc = broadcaster.AddListener(listener, lldb.SBProcess.eBroadcastBitStateChanged)
+        self.assertTrue(rc, "AddListener successfully retruns")
+
+        traceOn = self.TraceOn()
+        if traceOn:
+            lldbutil.print_stacktraces(process)
+
+        # Create MyListeningThread class to wait for any kind of event.
+        import threading
+        class MyListeningThread(threading.Thread):
+            def run(self):
+                count = 0
+                # Let's only try at most 4 times to retrieve any kind of event.
+                # After that, the thread exits.
+                while not count > 3:
+                    if traceOn:
+                        print "Try wait for event..."
+                    if listener.WaitForEventForBroadcasterWithType(5,
+                                                                   broadcaster,
+                                                                   lldb.SBProcess.eBroadcastBitStateChanged,
+                                                                   event):
+                        if traceOn:
+                            desc = lldbutil.get_description(event)
+                            print "Event description:", desc
+                            print "Event data flavor:", event.GetDataFlavor()
+                            print "Process state:", lldbutil.state_type_to_str(process.GetState())
+                            print
+                    else:
+                        if traceOn:
+                            print "timeout occurred waiting for event..."
+                    count = count + 1
+                return
+
+        # Let's start the listening thread to retrieve the events.
+        my_thread = MyListeningThread()
+        my_thread.start()
+
+        # Use Python API to continue the process.  The listening thread should be
+        # able to receive the state changed events.
+        process.Continue()
+
+        # Use Python API to kill the process.  The listening thread should be
+        # able to receive the state changed event, too.
+        process.Kill()
+
+        # Wait until the 'MyListeningThread' terminates.
+        my_thread.join()
+
     def do_wait_for_event(self):
         """Get the listener associated with the debugger and exercise WaitForEvent API."""
         exe = os.path.join(os.getcwd(), "a.out")
@@ -84,6 +169,8 @@
                 while not count > 3:
                     if listener.WaitForEvent(5, event):
                         #print "Got a valid event:", event
+                        #print "Event data flavor:", event.GetDataFlavor()
+                        #print "Event type:", lldbutil.state_type_to_str(event.GetType())
                         return
                     count = count + 1
                     print "Timeout: listener.WaitForEvent"





More information about the lldb-commits mailing list