Summary: | cairo detects and uses buggy sincos() on Tru64, cairo_matrix_init_rotate | ||
---|---|---|---|
Product: | cairo | Reporter: | Tim Mooney <Tim.Mooney> |
Component: | general | Assignee: | Carl Worth <cworth> |
Status: | RESOLVED FIXED | QA Contact: | cairo-bugs mailing list <cairo-bugs> |
Severity: | normal | ||
Priority: | high | ||
Version: | 1.0.0 | ||
Hardware: | Alpha | ||
OS: | All | ||
Whiteboard: | |||
i915 platform: | i915 features: | ||
Attachments: | Remove use of sincos from cairo |
Created attachment 3203 [details] [review] Remove use of sincos from cairo Ouch. I don't think we have any record that using sincos is a measurable performance win. In the light of this bug, I favor removing its use. Does the attached patch solve the problem for you? Verified. With this patch, the "transforms" and "text-rotate" tests no longer segfault (and they pass). Thanks for verifying. Now fixed in CVS to appear in both 1.0.2 and 1.2.0: 2005-09-12 Carl Worth <cworth@cworth.org> Fix for bug #4401 as reported by Tim Mooney: * configure.in: Don't bother checking for sincos function. * src/cairo-matrix.c: (cairo_matrix_init_rotate): Don't use sincos function since it is apparently buggy on some platforms, (Tru64 at least). |
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.
cairo's configure detects that Tru64 has some symbol named sincos(), so it uses it in cairo_matrix_init_rotate(). sincos isn't documented on Tru64 and I can't find anything about it in any of the headers, so it's not even at the level of "deprecated" or "obsolete" interface. Using sincos() causes problems (SIGFPE, floating point exception) for tests like transforms, and likely causes problems in real-world code too, because the values that get filled into the cairo_matrix_t by cairo_matrix_init_rotate() likely trigger underflow: (ladebug) list 560 } 561 562 cairo_status_t 563 _cairo_gstate_rotate (cairo_gstate_t *gstate, double angle) 564 { 565 cairo_matrix_t tmp; 566 567 _cairo_gstate_unset_scaled_font (gstate); 568 569 cairo_matrix_init_rotate (&tmp, angle); > 570 cairo_matrix_multiply (&gstate->ctm, &tmp, &gstate->ctm); 571 572 cairo_matrix_init_rotate (&tmp, -angle); 573 cairo_matrix_multiply (&gstate->ctm_inverse, &gstate->ctm_inverse, &tmp); 574 575 return CAIRO_STATUS_SUCCESS; 576 } (ladebug) print angle 1.5707963267948966 (ladebug) print tmp struct _cairo_matrix { xx = 2.172393021099427e-311; yx = 2.6525782160381117e-314; xy = -2.6525782160381117e-314; yy = 2.172393021099427e-311; x0 = 0; y0 = 0; } These values trigger the SIGFPE in the cairo_matrix_multiply() routine. If I #undef HAVE_SINCOS and rebuild, so that separate calls to sin() and cos() are made, the values filled in by cairo_matrix_init_rotate are much more sensible, and the transforms test passes. If it's a big win performance-wise to call sincos() instead of separate calls to sin() and cos(), I can try find a way to augment the autoconf test for sincos() so that it detects a nonfunctional sincos(). If it's not a big win, it might be better to just use sin() and cos() all the time. Let me know what you think the best approach is.