public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM]  archer-swagiaal-oguz: Change events to be process wide.
@ 2010-12-10 17:31 swagiaal
  0 siblings, 0 replies; only message in thread
From: swagiaal @ 2010-12-10 17:31 UTC (permalink / raw)
  To: archer-commits

The branch, archer-swagiaal-oguz has been updated
       via  cfe32b5303f8a09ce72bb46de3297e64316b9c07 (commit)
      from  a713c6ad485f2f7d24a0982258b42a56910ae066 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit cfe32b5303f8a09ce72bb46de3297e64316b9c07
Author: Sami Wagiaalla <swagiaal@redhat.com>
Date:   Fri Dec 10 12:18:50 2010 -0500

    Change events to be process wide.
    
    Changed python syntax for adding events to reflect the fact
    that the events and not normally thread specific.

-----------------------------------------------------------------------

Summary of changes:
 gdb/python/py-breakpointstopevent.c   |   69 ++++++++-----------------
 gdb/python/py-continueevent.c         |   16 +-----
 gdb/python/py-event.c                 |   93 +++++++++++++++++++++++++++++++--
 gdb/python/py-event.h                 |   35 +++++++++++--
 gdb/python/py-exitedevent.c           |   14 ++----
 gdb/python/py-inferior.c              |   13 ++++-
 gdb/python/py-infthread.c             |   82 -----------------------------
 gdb/python/py-signalstopevent.c       |   29 +----------
 gdb/python/py-stopevent.c             |   40 +++++++++++---
 gdb/python/py-stopevent.h             |   29 ++++++++++-
 gdb/python/python-internal.h          |   13 +----
 gdb/python/python.c                   |    1 +
 gdb/testsuite/gdb.python/py-events.py |    8 ++--
 13 files changed, 227 insertions(+), 215 deletions(-)

First 500 lines of diff:
diff --git a/gdb/python/py-breakpointstopevent.c b/gdb/python/py-breakpointstopevent.c
index 8d06555..41ba491 100644
--- a/gdb/python/py-breakpointstopevent.c
+++ b/gdb/python/py-breakpointstopevent.c
@@ -21,55 +21,50 @@
 
 static PyTypeObject breakpoint_stop_event_object_type;
 
-typedef struct
-{
-  stop_event_object stop_event;
-  breakpoint_object *breakpoint;
-} breakpoint_stop_event_object;
-
 static void
 bp_stop_evpy_dealloc (PyObject *self)
 {
   Py_DECREF (((breakpoint_stop_event_object *) self)->breakpoint);
-  Py_DECREF (((breakpoint_stop_event_object *) self)->
-             stop_event.event.inferior_thread);
-
-  self->ob_type->tp_free (self);
-}
-
-/* Python function to get the stop event's breakpoint.  */
-
-static PyObject *
-bp_stop_evpy_get_breakpoint (PyObject *self, void *closure)
-{
-  breakpoint_stop_event_object *breakpoint_stop_event_obj =
-    (breakpoint_stop_event_object *) self;
-
-  //FIXME: Where is this reference being freed ?
-  Py_INCREF (breakpoint_stop_event_obj->breakpoint);
-
-  return (PyObject *) (breakpoint_stop_event_obj->breakpoint);
+  stop_evpy_dealloc (self);
 }
 
 /* Create and initialize a BreakpointStopEvent object.  */
 
 breakpoint_stop_event_object *
-create_breakpoint_stop_event_object (breakpoint_object *bp)
+create_breakpoint_stop_event_object (struct bpstats *bs, PyObject *stopped_thread)
 {
   breakpoint_stop_event_object *breakpoint_stop_event_obj =
       (breakpoint_stop_event_object *)
       create_stop_event_object (&breakpoint_stop_event_object_type,
-                                BREAKPOINT);
+                                BREAKPOINT,
+                                gdb_py_events->breakpoint_stop_event);
 
   if (!breakpoint_stop_event_obj)
     return NULL;
 
-  breakpoint_stop_event_obj->breakpoint = bp;
+  breakpoint_stop_event_obj->stop_event.event.inferior_thread =
+        stopped_thread;
+
+  breakpoint_stop_event_obj->breakpoint = gdbpy_breakpoint_from_bpstats (bs);
   Py_INCREF (breakpoint_stop_event_obj->breakpoint);
 
   return breakpoint_stop_event_obj;
 }
 
+/* Python function to get the stop event's breakpoint.  */
+
+static PyObject *
+bp_stop_evpy_get_breakpoint (PyObject *self, void *closure)
+{
+  breakpoint_stop_event_object *breakpoint_stop_event_obj =
+    (breakpoint_stop_event_object *) self;
+
+  //FIXME: Where is this reference being freed ?
+  Py_INCREF (breakpoint_stop_event_obj->breakpoint);
+
+  return (PyObject *) (breakpoint_stop_event_obj->breakpoint);
+}
+
 /* Initialize the Python breakpoint stop event code.  */
 
 void
@@ -84,26 +79,6 @@ gdbpy_initialize_breakpoint_stop_event (void)
                       (PyObject *) &breakpoint_stop_event_object_type);
 }
 
-/* Callback function which notifies listeners when a stop event occurs.
-   This function will create a new python BreakpointStopEvent object.  */
-
-void
-emit_breakpoint_stop_event (struct bpstats *bs)
-{
-  thread_object *inferior_thread;
-  breakpoint_object *breakpoint;
-  breakpoint_stop_event_object *breakpoint_stop_event_obj;
-
-  inferior_thread = find_thread_object (inferior_ptid);
-
-  breakpoint = gdbpy_breakpoint_from_bpstats (bs);
-
-  breakpoint_stop_event_obj = create_breakpoint_stop_event_object (breakpoint);
-
-  evpy_emit_event ((event_object *) breakpoint_stop_event_obj,
-                   inferior_thread->breakpoint_stop_event);
-}
-
 static PyGetSetDef breakpoint_stop_event_object_getset[] =
 {
   { "breakpoint", bp_stop_evpy_get_breakpoint, NULL, "Breakpoint.", NULL },
diff --git a/gdb/python/py-continueevent.c b/gdb/python/py-continueevent.c
index 927fa08..190334e 100644
--- a/gdb/python/py-continueevent.c
+++ b/gdb/python/py-continueevent.c
@@ -37,7 +37,8 @@ create_continue_event_object ()
 {
   return (continue_event_object *)
       create_event_object (&continue_event_object_type,
-                           "continue");
+                           "continue",
+                           gdb_py_events->continue_event);
 }
 
 /* Initialize the Python continue event code.  */
@@ -61,18 +62,7 @@ gdbpy_initialize_continue_event (void)
 void
 emit_continue_event (ptid_t ptid)
 {
-  thread_object *inferior_thread;
-  PyObject *callback_list;
-  PyObject *args_tuple;
-  Py_ssize_t i;
-  continue_event_object *continue_event_obj;
-
-  inferior_thread = find_thread_object (inferior_ptid);
-
-  continue_event_obj = create_continue_event_object();
-
-  evpy_emit_event ((event_object *) continue_event_obj,
-                   inferior_thread->continue_event);
+  evpy_emit_event ((event_object *) create_continue_event_object());
 }
 
 static PyTypeObject continue_event_object_type =
diff --git a/gdb/python/py-event.c b/gdb/python/py-event.c
index 9a66ad5..65ac3f5 100644
--- a/gdb/python/py-event.c
+++ b/gdb/python/py-event.c
@@ -27,7 +27,9 @@ evpy_dealloc (PyObject *self)
 }
 
 event_object *
-create_event_object (PyTypeObject *py_type, const char *event_type)
+create_event_object (PyTypeObject *py_type,
+                     const char *event_type,
+                     eventregistry_object *registry)
 {
   event_object *event_obj;
 
@@ -36,6 +38,7 @@ create_event_object (PyTypeObject *py_type, const char *event_type)
     return NULL;
 
   event_obj->event_type = (PyStringObject *) PyString_FromString (event_type);
+  event_obj->registry = registry;
 
   return event_obj;
 }
@@ -66,6 +69,45 @@ evpy_get_event_type (PyObject *self, void *closure)
   return (PyObject *) (event_obj->event_type);
 }
 
+/* Initialize python events.  */
+
+void
+gdbpy_initialize_py_events()
+{
+
+  if (PyType_Ready (&events_object_type) < 0)
+    return;
+
+  gdb_py_events = PyObject_New (events_object,
+                                &events_object_type);
+
+  gdb_py_events->stop_event = create_eventregistry_object ();
+  gdb_py_events->breakpoint_stop_event = create_eventregistry_object ();
+  gdb_py_events->signal_stop_event = create_eventregistry_object ();
+  gdb_py_events->continue_event = create_eventregistry_object ();
+  gdb_py_events->exited_event = create_eventregistry_object ();
+
+  PyDict_SetItemString (events_object_type.tp_dict,
+                        "stop_event",
+                        (PyObject *) gdb_py_events->stop_event);
+  PyDict_SetItemString (events_object_type.tp_dict,
+                        "breakpoint_event",
+                        (PyObject *) gdb_py_events->breakpoint_stop_event);
+  PyDict_SetItemString (events_object_type.tp_dict,
+                        "signal_event",
+                        (PyObject *) gdb_py_events->signal_stop_event);
+  PyDict_SetItemString (events_object_type.tp_dict,
+                        "continue_event",
+                        (PyObject *) gdb_py_events->continue_event);
+  PyDict_SetItemString (events_object_type.tp_dict,
+                        "exited_event",
+                        (PyObject *) gdb_py_events->exited_event);
+
+  Py_INCREF (&events_object_type);
+  PyModule_AddObject (gdb_module, "events", (PyObject *) &events_object_type);
+}
+
+
 /* Initialize the Python event code. */
 void
 gdbpy_initialize_event (void)
@@ -80,14 +122,14 @@ gdbpy_initialize_event (void)
 /* Notify the list of listens that the given EVENT has occured.  */
 
 void
-evpy_emit_event (event_object *event, eventregistry_object *registry)
+evpy_emit_event (event_object *event)
 {
   PyObject *callback_list;
   PyObject *callback_list_copy;
   PyObject *args_tuple;
   Py_ssize_t i;
 
-  callback_list = (PyObject *) (registry->callbacks);
+  callback_list = (PyObject *) (event->registry->callbacks);
 
   /* Create a copy of call back list and use that for
      notifying listeners to avoid skipping callbacks
@@ -104,8 +146,6 @@ evpy_emit_event (event_object *event, eventregistry_object *registry)
     {
       PyObject_CallObject (PyList_GET_ITEM (callback_list_copy, i), args_tuple);
     }
-
-
 }
 
 static PyGetSetDef event_object_getset[] =
@@ -158,3 +198,46 @@ PyTypeObject event_object_type =
   0,                                          /* tp_init */
   0                                           /* tp_alloc */
 };
+
+PyTypeObject events_object_type =
+{
+  PyObject_HEAD_INIT (NULL)
+  0,                                          /* ob_size */
+  "gdb.events",                               /* tp_name */
+  sizeof (events_object),                     /* tp_basicsize */
+  0,                                          /* tp_itemsize */
+  0,                                          /* tp_dealloc */
+  0,                                          /* tp_print */
+  0,                                          /* tp_getattr */
+  0,                                          /* tp_setattr */
+  0,                                          /* tp_compare */
+  0,                                          /* tp_repr */
+  0,                                          /* tp_as_number */
+  0,                                          /* tp_as_sequence */
+  0,                                          /* tp_as_mapping */
+  0,                                          /* tp_hash  */
+  0,                                          /* tp_call */
+  0,                                          /* tp_str */
+  0,                                          /* tp_getattro */
+  0,                                          /* tp_setattro */
+  0,                                          /* tp_as_buffer */
+  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,   /* tp_flags */
+  "GDB events object. This Object holds references to all the\
+  gdb events that clients can listen to.",    /* tp_doc */
+  0,                                          /* tp_traverse */
+  0,                                          /* tp_clear */
+  0,                                          /* tp_richcompare */
+  0,                                          /* tp_weaklistoffset */
+  0,                                          /* tp_iter */
+  0,                                          /* tp_iternext */
+  0,                                          /* tp_methods */
+  0,                                          /* tp_members */
+  0,                                          /* tp_getset */
+  0,                                          /* tp_base */
+  0,                                          /* tp_dict */
+  0,                                          /* tp_descr_get */
+  0,                                          /* tp_descr_set */
+  0,                                          /* tp_dictoffset */
+  0,                                          /* tp_init */
+  0                                           /* tp_alloc */
+};
diff --git a/gdb/python/py-event.h b/gdb/python/py-event.h
index 662c5df..c4a34a1 100644
--- a/gdb/python/py-event.h
+++ b/gdb/python/py-event.h
@@ -17,6 +17,9 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
+#ifndef GDB_PY_EVENT_H
+#define GDB_PY_EVENT_H
+
 #include "defs.h"
 #include "command.h"
 #include "python-internal.h"
@@ -25,13 +28,37 @@
 typedef struct
 {
   PyObject_HEAD
+  /* The registery of listeners to be notified about this event instance.   */
+  eventregistry_object *registry;
 
-  thread_object *inferior_thread;
+  PyObject *inferior_thread;
   PyStringObject *event_type;
 } event_object;
 
-extern void evpy_emit_event (event_object *event,
-                             eventregistry_object *registry);
+typedef struct
+{
+  PyObject_HEAD
+
+  eventregistry_object *stop_event;
+  eventregistry_object *breakpoint_stop_event;
+  eventregistry_object *signal_stop_event;
+  eventregistry_object *continue_event;
+  eventregistry_object *exited_event;
+
+} events_object;
+
+/* Python events singleton.  */
+events_object *gdb_py_events;
+
+extern void emit_stop_event (struct bpstats *bs, const char *stop_signal);
+extern void emit_continue_event (ptid_t ptid);
+extern void emit_exited_event (thread_object *inferior_thread,
+                               LONGEST *exit_code);
+
+extern void evpy_emit_event (event_object *event);
 extern event_object * create_event_object (PyTypeObject *py_type,
-                                    const char *event_type);
+                                    const char *event_type,
+                                    eventregistry_object *registry);
 extern void evpy_dealloc (PyObject *self);
+
+#endif /* GDB_PY_EVENT_H */
diff --git a/gdb/python/py-exitedevent.c b/gdb/python/py-exitedevent.c
index b201580..516ea29 100644
--- a/gdb/python/py-exitedevent.c
+++ b/gdb/python/py-exitedevent.c
@@ -41,7 +41,8 @@ create_exited_event_object (thread_object *inferior_thread, LONGEST *exit_code)
 
   exited_event = (exited_event_object *)
       create_event_object (&exited_event_object_type,
-                           "exit");
+                           "exit",
+                           gdb_py_events->exited_event);
 
   if (!exited_event)
     return NULL;
@@ -70,15 +71,8 @@ void gdbpy_initialize_exited_event (void)
 void
 emit_exited_event (thread_object *inferior_thread, LONGEST *exit_code)
 {
-  PyObject *callback_list;
-  PyObject *args_tuple;
-  Py_ssize_t i;
-  exited_event_object *exited_event_obj;
-
-  exited_event_obj = create_exited_event_object (inferior_thread, exit_code);
-
-  evpy_emit_event ((event_object *) exited_event_obj,
-                   inferior_thread->exited_event);
+  evpy_emit_event ((event_object *)
+                   create_exited_event_object (inferior_thread, exit_code));
 }
 
 /* Python function to get the exited event's exit code.  */
diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c
index cc9a89d..c277335 100644
--- a/gdb/python/py-inferior.c
+++ b/gdb/python/py-inferior.c
@@ -27,6 +27,8 @@
 #include "arch-utils.h"
 #include "language.h"
 #include "gdb_signals.h"
+#include "py-event.h"
+#include "py-stopevent.h"
 
 struct threadlist_entry {
   thread_object *thread_obj;
@@ -46,6 +48,13 @@ typedef struct
 
   /* Number of threads in the list.  */
   int nthreads;
+
+  eventregistry_object *stop_event;
+  eventregistry_object *breakpoint_stop_event;
+  eventregistry_object *signal_stop_event;
+  eventregistry_object *continue_event;
+  eventregistry_object *exited_event;
+
 } inferior_object;
 
 static PyTypeObject inferior_object_type;
@@ -175,8 +184,8 @@ inferior_to_inferior_object (struct inferior *inferior)
 
 /* Finds the Python Inferior object for the given PID.  Returns a
    borrowed reference, or NULL if PID does not match any inferior
-   obect.
-  */
+   obect.  */
+
 PyObject *
 find_inferior_object (int pid)
 {
diff --git a/gdb/python/py-infthread.c b/gdb/python/py-infthread.c
index 8732e5e..64f0a21 100644
--- a/gdb/python/py-infthread.c
+++ b/gdb/python/py-infthread.c
@@ -51,12 +51,6 @@ create_thread_object (struct thread_info *tp)
   thread_obj->inf_obj = find_inferior_object (PIDGET (tp->ptid));
   Py_INCREF (thread_obj->inf_obj);
 
-  thread_obj->stop_event = create_eventregistry_object ();
-  thread_obj->breakpoint_stop_event = create_eventregistry_object ();
-  thread_obj->signal_stop_event = create_eventregistry_object ();
-  thread_obj->continue_event = create_eventregistry_object ();
-  thread_obj->exited_event = create_eventregistry_object ();
-
   return thread_obj;
 }
 
@@ -66,11 +60,6 @@ static void
 thpy_dealloc (PyObject *self)
 {
   Py_DECREF (((thread_object *) self)->inf_obj);
-  Py_DECREF (((thread_object *) self)->stop_event);
-  Py_DECREF (((thread_object *) self)->breakpoint_stop_event);
-  Py_DECREF (((thread_object *) self)->signal_stop_event);
-  Py_DECREF (((thread_object *) self)->continue_event);
-  Py_DECREF (((thread_object *) self)->exited_event);
   self->ob_type->tp_free (self);
 }
 
@@ -84,66 +73,6 @@ thpy_get_num (PyObject *self, void *closure)
   return PyLong_FromLong (thread_obj->thread->num);
 }
 
-static PyObject *
-thpy_get_stop_eventregistry (PyObject *self, void *closure)
-{
-  thread_object *thread_obj = (thread_object *) self;
-
-  THPY_REQUIRE_VALID (thread_obj);
-
-  Py_INCREF (thread_obj->stop_event);
-
-  return (PyObject *) (thread_obj->stop_event);
-}
-
-static PyObject *
-thpy_get_breakpoint_stop_eventregistry (PyObject *self, void *closure)
-{
-  thread_object *thread_obj = (thread_object *) self;
-
-  THPY_REQUIRE_VALID (thread_obj);
-
-  Py_INCREF (thread_obj->breakpoint_stop_event);
-
-  return (PyObject *) (thread_obj->breakpoint_stop_event);
-}
-
-static PyObject *
-thpy_get_signal_stop_eventregistry (PyObject *self, void *closure)
-{
-  thread_object *thread_obj = (thread_object *) self;
-
-  THPY_REQUIRE_VALID (thread_obj);
-
-  Py_INCREF (thread_obj->signal_stop_event);
-
-  return (PyObject *) (thread_obj->signal_stop_event);
-}
-
-static PyObject *
-thpy_get_continue_eventregistry (PyObject *self, void *closure)
-{
-  thread_object *thread_obj = (thread_object *) self;
-
-  THPY_REQUIRE_VALID (thread_obj);
-
-  Py_INCREF (thread_obj->continue_event);
-
-  return (PyObject *) (thread_obj->continue_event);
-}
-
-static PyObject *
-thpy_get_exited_eventregistry (PyObject *self, void *closure)
-{
-  thread_object *thread_obj = (thread_object *) self;
-
-  THPY_REQUIRE_VALID (thread_obj);
-
-  Py_INCREF (thread_obj->exited_event);


hooks/post-receive
--
Repository for Project Archer.


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2010-12-10 17:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-12-10 17:31 [SCM] archer-swagiaal-oguz: Change events to be process wide swagiaal

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).