On Wed, Apr 29, 2009 at 10:03:44PM -0500, Maurice LeBrun wrote:
> On Wednesday, April 29, 2009 at 21:58:03 (+0100) Andrew Ross writes:
> > Further testing has shown that I can get rid of the segmentation fault by
> > removing the call to XInitThreads in the OpenXwin function in xwin.c.
> > According to the Xlib documentation:
> >
> > "The XInitThreads() function initializes Xlib support for concurrent
> > threads. This function must be the first Xlib function a multi-threaded
> > program calls, and it must complete before any other Xlib call is made.
> > This function returns a nonzero status if initialization was successful;
> > otherwise, it returns zero. On systems that do not support threads, this
> > function always returns zero.
> >
> > It is only necessary to call this function if multiple threads might use
> > Xlib concurrently. If all calls to Xlib functions are protected by some
> > other access mechanism (for example, a mutual exclusion lock in a toolkit
> > or through explicit client programming), Xlib thread initialization is
> > not required. It is recommended that single-threaded programs not call
> > this function."
> > ..
> > In particular, with the tk support there may be other Xlib calls
> > elsewhere which are not protected. It is also probable that
> > XInitThreads is not actually the first Xlib call in this case.
>
> It is not. In plframe.c the window is created by:
>
> new = Tk_CreateWindowFromPath(interp, Tk_MainWindow(interp),
> argv[1], (char *) NULL);
>
> which ultimately terminates in a call to XCreateWindow(). From the Tk
> generic/tkWindow.c --
>
> * tkWindow.c --
> *
> * This file provides basic window-manipulation procedures,
> * which are equivalent to procedures in Xlib (and even
> * invoke them) but also maintain the local Tk_Window
> * structure.
>
> The partial initialization of the xwin driver the plframe widget does after
> that may not require the window to actually already exist -- I don't see any
> explicit dependence, although it's been too long for me to remember if I ever
> tried doing the two ops in reverse order. You might want to give this a try.
> I.e. move the code
>
> /* Partially initialize X driver. */
>
> pllib_init();
>
> plsdev("xwin");
> pllib_devinit();
> plP_esc(PLESC_DEVINIT, NULL);
>
> above the call to Tk_CreateWindowFromPath().
I think I have convinced myself that XInitThreads is needed for the Tk case
since
we don't control all the Xlib calls. A quick web search suggests our symptoms
are probably a result of Xlib calls being made before XInitThreads is called.
I tried Maurice's suggestion, but this does not help. It is still not early
enough.
Adding a call to XInitThreads into the start of tkMain.c does solve the problem
though. The additional call in xwin.c does not seem to be a problem. This leaves
the basic xwin code unchanged and only affects the tk code, so I am happy to
commit this ahead of the release and to re-enable HAVE_PTHREAD by default.
Andrew
------------------------------------------------------------------------------
Register Now & Save for Velocity, the Web Performance & Operations
Conference from O'Reilly Media. Velocity features a full day of
expert-led, hands-on workshops and two days of sessions from industry
leaders in dedicated Performance & Operations tracks. Use code vel09scf
and Save an extra 15% before 5/3. http://p.sf.net/sfu/velocityconf
_______________________________________________
Plplot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/plplot-devel