[cairo] [PATCH 1/2 v2] pthread-same-source: Add ref image generation

Bryce W. Harrington b.harrington at samsung.com
Sat Apr 12 15:01:50 PDT 2014


On Sat, Apr 12, 2014 at 12:11:54PM +0200, Uli Schlachter wrote:
> When the new GENERATE_REFERENCE symbol is defined to 1, no threads are involved
> at all. In this case, all operations are done sequentially by the main thread.
> 
> Thus, in this mode no thread issues can occur and the result must be usable as
> reference images.
> 
> Signed-off-by: Uli Schlachter <psychon at znc.in>
> ---
> Hi everyone,
> 
> with this new version of the patch I got rid all pthread calls. It replaces
> patches 1 and 2 of the series that I sent yesterday. I think that this version
> is nicer than the one that I sent before.

Ah, yes I agree.  Sorry, was confused by the patch series numbering.

Reviewed-by: Bryce Harrington <b.harrington at samsung.com>

> Uli
> 
>  test/pthread-same-source.c | 25 ++++++++++++++++++++++---
>  1 file changed, 22 insertions(+), 3 deletions(-)
> 
> diff --git a/test/pthread-same-source.c b/test/pthread-same-source.c
> index d0eda4a..2b26d18 100644
> --- a/test/pthread-same-source.c
> +++ b/test/pthread-same-source.c
> @@ -24,8 +24,12 @@
>   * Author: Benjamin Otte <otte at gnome.org>
>   */
>  
> +#define GENERATE_REFERENCE 0
> +
>  #include "cairo-test.h"
> +#if !GENERATE_REFERENCE
>  #include <pthread.h>
> +#endif
>  
>  #define N_THREADS 8
>  
> @@ -110,7 +114,9 @@ create_source (cairo_surface_t *similar)
>  static cairo_test_status_t
>  draw (cairo_t *cr, int width, int height)
>  {
> +#if !GENERATE_REFERENCE
>      pthread_t threads[N_THREADS];
> +#endif
>      thread_data_t thread_data[N_THREADS];
>      cairo_test_status_t test_status = CAIRO_TEST_SUCCESS;
>      cairo_surface_t *source;
> @@ -125,12 +131,16 @@ draw (cairo_t *cr, int width, int height)
>  					      status);
>      }
>  
> +    cairo_set_source_rgb (cr, 0.5, 0.5, 0.5);
> +    cairo_paint (cr);
> +
>      for (i = 0; i < N_THREADS; i++) {
>          thread_data[i].target = cairo_surface_create_similar (cairo_get_target (cr),
>                                                                CAIRO_CONTENT_COLOR_ALPHA,
>                                                                4 * WIDTH, 4 * HEIGHT);
>          thread_data[i].source = cairo_surface_reference (source);
>          thread_data[i].id = i;
> +#if !GENERATE_REFERENCE
>          if (pthread_create (&threads[i], NULL, draw_thread, &thread_data[i]) != 0) {
>  	    threads[i] = pthread_self (); /* to indicate error */
>              cairo_surface_destroy (thread_data[i].target);
> @@ -138,13 +148,21 @@ draw (cairo_t *cr, int width, int height)
>              test_status = CAIRO_TEST_FAILURE;
>  	    break;
>          }
> +#else
> +	{
> +	    cairo_surface_t *surface = draw_thread(&thread_data[i]);
> +	    cairo_set_source_surface (cr, surface, 0, 0);
> +	    cairo_surface_destroy (surface);
> +	    cairo_paint (cr);
> +
> +	    cairo_translate (cr, 0, 4 * HEIGHT);
> +	}
> +#endif
>      }
>  
>      cairo_surface_destroy (source);
>  
> -    cairo_set_source_rgb (cr, 0.5, 0.5, 0.5);
> -    cairo_paint (cr);
> -
> +#if !GENERATE_REFERENCE
>      for (i = 0; i < N_THREADS; i++) {
>  	void *surface;
>  
> @@ -161,6 +179,7 @@ draw (cairo_t *cr, int width, int height)
>              test_status = CAIRO_TEST_FAILURE;
>  	}
>      }
> +#endif
>  
>      return test_status;
>  }
> -- 
> 1.9.1
> 
> -- 
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo


More information about the cairo mailing list