From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9950 invoked by alias); 1 Nov 2010 02:26:48 -0000 Received: (qmail 9941 invoked by uid 22791); 1 Nov 2010 02:26:47 -0000 X-SWARE-Spam-Status: No, hits=-4.4 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_DB,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from smtp-out.google.com (HELO smtp-out.google.com) (74.125.121.35) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 01 Nov 2010 02:26:42 +0000 Received: from hpaq3.eem.corp.google.com (hpaq3.eem.corp.google.com [172.25.149.3]) by smtp-out.google.com with ESMTP id oA12Qer1028014 for ; Sun, 31 Oct 2010 19:26:40 -0700 Received: from ruffy.mtv.corp.google.com (ruffy.mtv.corp.google.com [172.18.118.116]) by hpaq3.eem.corp.google.com with ESMTP id oA12QcPR006371 for ; Sun, 31 Oct 2010 19:26:39 -0700 Received: by ruffy.mtv.corp.google.com (Postfix, from userid 67641) id 812792461AF; Sun, 31 Oct 2010 19:26:38 -0700 (PDT) To: gdb-patches@sourceware.org Subject: [patch] New function finish_python_initialization Message-Id: <20101101022638.812792461AF@ruffy.mtv.corp.google.com> Date: Mon, 01 Nov 2010 02:26:00 -0000 From: dje@google.com (Doug Evans) X-System-Of-Record: true X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-11/txt/msg00000.txt.bz2 Hi. While implementing some commands in python I ran into some order-of-initialization issues. For example, any new "info" commands implemented in python require the "info" command prefix. This patch fixes things by moving the evaluation of the init python script to after most of the gdb initialization. That way the python script can punt on further such issues. I thought of renaming _initialize_python and explicitly calling it later (and thus avoid having two python init routines) but that doesn't work (at least not without more effort). _initialize_python has to be called before initialize_progspace (the python code has two progspace data keys). And the contents of the new finish_python_initialization has to be done after the call to init_cli_cmds (so that the "info" command prefix is there). I will check this in in two days if there are no objections. 2010-10-31 Doug Evans * top.c: #include "python/python.h". (gdb_init): Add a comment regarding initialize_all_files. Call finish_python_initialization at the end. * python/python.h (finish_python_initialization): Declare. * python/python.c (finish_python_initialization): New function. (_initialize_python): Move python-implemented initialization there and call it. (GdbMethods): Use #ifdef HAVE_PYTHON for consistency. Index: top.c =================================================================== RCS file: /cvs/src/src/gdb/top.c,v retrieving revision 1.184 diff -u -p -r1.184 top.c --- top.c 11 Sep 2010 16:00:25 -0000 1.184 +++ top.c 1 Nov 2010 02:10:06 -0000 @@ -47,6 +47,7 @@ #include "main.h" #include "event-loop.h" #include "gdbthread.h" +#include "python/python.h" /* readline include files */ #include "readline/readline.h" @@ -1657,7 +1658,10 @@ gdb_init (char *argv0) init_cmd_lists (); /* This needs to be done first */ initialize_targets (); /* Setup target_terminal macros for utils.c */ initialize_utils (); /* Make errors and warnings possible */ + + /* Here is where we call all the _initialize_foo routines. */ initialize_all_files (); + /* This creates the current_program_space. Do this after all the _initialize_foo routines have had a chance to install their per-sspace data keys. Also do this before @@ -1684,4 +1688,12 @@ gdb_init (char *argv0) deprecated_init_ui_hook. */ if (deprecated_init_ui_hook) deprecated_init_ui_hook (argv0); + +#ifdef HAVE_PYTHON + /* Python initialization can require various commands to be installed. + For example "info pretty-printer" needs the "info" prefix to be + installed. Keep things simple and just do final python initialization + here. */ + finish_python_initialization (); +#endif } Index: python/python.c =================================================================== RCS file: /cvs/src/src/gdb/python/python.c,v retrieving revision 1.51 diff -u -p -r1.51 python.c --- python/python.c 13 Oct 2010 13:24:39 -0000 1.51 +++ python/python.c 1 Nov 2010 02:10:07 -0000 @@ -997,9 +997,26 @@ Enables or disables printing of Python s gdbpy_doc_cst = PyString_FromString ("__doc__"); gdbpy_enabled_cst = PyString_FromString ("enabled"); - /* Remaining initialization is done in Python. - - create a couple objects which are used for Python's stdout and stderr - - provide function GdbSetPythonDirectory */ + /* Release the GIL while gdb runs. */ + PyThreadState_Swap (NULL); + PyEval_ReleaseLock (); + +#endif /* HAVE_PYTHON */ +} + +#ifdef HAVE_PYTHON + +/* Perform the remaining python initializations. + These must be done after GDB is at least mostly initialized. + E.g., The "info pretty-printer" command needs the "info" prefix + command installed. */ + +void +finish_python_initialization (void) +{ + struct cleanup *cleanup; + + cleanup = ensure_python_env (get_current_arch (), current_language); PyRun_SimpleString ("\ import os\n\ @@ -1055,16 +1072,14 @@ def GdbSetPythonDirectory (dir):\n\ GdbSetPythonDirectory (gdb.PYTHONDIR)\n\ "); - /* Release the GIL while gdb runs. */ - PyThreadState_Swap (NULL); - PyEval_ReleaseLock (); + do_cleanups (cleanup); +} #endif /* HAVE_PYTHON */ -} -#if HAVE_PYTHON +#ifdef HAVE_PYTHON static PyMethodDef GdbMethods[] = { Index: python/python.h =================================================================== RCS file: /cvs/src/src/gdb/python/python.h,v retrieving revision 1.10 diff -u -p -r1.10 python.h --- python/python.h 11 Jun 2010 15:36:09 -0000 1.10 +++ python/python.h 1 Nov 2010 02:10:07 -0000 @@ -24,6 +24,8 @@ extern int gdbpy_global_auto_load; +extern void finish_python_initialization (void); + void eval_python_from_control_command (struct command_line *); void source_python_script (FILE *stream, const char *file);