public inbox for archer-commits@sourceware.org help / color / mirror / Atom feed
From: swagiaal@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] archer-swagiaal-oguz: Change events to be process wide. Date: Fri, 10 Dec 2010 17:31:00 -0000 [thread overview] Message-ID: <20101210173149.31860.qmail@sourceware.org> (raw) 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.
reply other threads:[~2010-12-10 17:31 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20101210173149.31860.qmail@sourceware.org \ --to=swagiaal@sourceware.org \ --cc=archer-commits@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).