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).