google-code-export / pyglet

Automatically exported from code.google.com/p/pyglet
BSD 3-Clause "New" or "Revised" License
1 stars 1 forks source link

Race condition leads to crash calling glDeleteBuffers #565

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?
1. Haven't been able to reproduce in small test program
2. The program where I see this problem uses lots of labels and image.blit, no 
3D stuff

Paste in the traceback or error message:

Traceback (most recent call last):
  File "main.py", line 14, in <module>
    pyglet.app.run()
  File "/opt/src/pyglet/pyglet/app/__init__.py", line 123, in run
    event_loop.run()
  File "/opt/src/pyglet/pyglet/app/base.py", line 135, in run
    self._run_estimated()
  File "/opt/src/pyglet/pyglet/app/base.py", line 164, in _run_estimated
    timeout = self.idle()
  File "/opt/src/pyglet/pyglet/app/base.py", line 278, in idle
    window.switch_to()
  File "/opt/src/pyglet/pyglet/window/xlib/__init__.py", line 451, in switch_to
    self.context.set_current()
  File "/opt/src/pyglet/pyglet/gl/xlib.py", line 330, in set_current
    super(XlibContext13, self).set_current()
  File "/opt/src/pyglet/pyglet/gl/base.py", line 322, in set_current
    buffers = (gl.GLuint * len(buffers))(*buffers)
IndexError: invalid index

pyglet 1.1 with Python 2.5: Paste in the output of `python -m pyglet.info`
Other: Paste in the output of tools/gl_info.py (included in source distro):

Platform instance is <pyglet.window.Platform object at 0x1d16210>
Display instance is <pyglet.canvas.xlib.XlibDisplay object at 0x26a1210>
Screens:
  XlibScreen(display=<pyglet.canvas.xlib.XlibDisplay object at 0x26a1210>, x=0, y=0, width=1920, height=1080, xinerama=0)
Creating default context...
GL attributes:
double_buffer=1 stereo=0 buffer_size=32 aux_buffers=4 sample_buffers=0
samples=0 red_size=8 green_size=8 blue_size=8 alpha_size=0
depth_size=24 stencil_size=0 accum_red_size=16 accum_green_size=16
accum_blue_size=16 accum_alpha_size=16 major_version=None
minor_version=None forward_compatible=None debug=None
GL version: 3.3.0 NVIDIA 290.10
GL vendor: NVIDIA Corporation
GL renderer: GeForce 8400 GS/PCI/SSE2
GL extensions:
  GL_ARB_texture_compression GL_ARB_texture_swizzle
  GL_ARB_instanced_arrays GL_OES_packed_depth_stencil
  GL_NV_fragment_program_option GL_ARB_explicit_attrib_location
  GL_EXT_blend_color GL_EXT_blend_subtract
  GL_OES_texture_half_float_linear GL_EXT_stencil_wrap GL_NV_fence
  GL_EXT_vertex_array GL_IBM_texture_mirrored_repeat
  GL_SGIX_depth_texture GL_EXT_texture_compression_s3tc
  GL_EXT_import_sync_object GL_NV_blend_minmax GL_OES_get_program_binary
  GL_NV_vertex_program2_option GL_OES_rgb8_rgba8
  GL_EXT_texture_buffer_object GL_ARB_depth_texture
  GL_NV_packed_depth_stencil GL_EXTX_framebuffer_mixed_formats
  GL_OES_texture_half_float GL_NV_vertex_array_range2
  GL_EXT_direct_state_access GL_EXT_Cg_shader
  GL_EXT_texture_format_BGRA8888 GL_NV_vertex_program
  GL_EXT_framebuffer_sRGB GL_EXT_texture_object
  GL_NVX_conditional_render GL_NV_texture_compression_vtc
  GL_ARB_copy_buffer GL_NV_multisample_coverage
  GL_EXT_blend_func_separate GL_NV_texture_rectangle
  GL_ARB_shading_language_packing GL_ARB_occlusion_query2
  GL_ARB_occlusion_query GL_NV_texgen_reflection GL_ARB_transpose_matrix
  GL_ARB_provoking_vertex GL_EXT_gpu_shader4 GL_OES_fbo_render_mipmap
  GL_OES_vertex_array_object GL_ARB_depth_buffer_float
  GL_OES_standard_derivatives GL_ARB_texture_border_clamp
  GL_EXT_fog_coord GL_NV_depth_clamp GL_ARB_fragment_coord_conventions
  GL_NV_alpha_test GL_ARB_texture_cube_map GL_ARB_half_float_vertex
  GL_NV_vertex_buffer_unified_memory GL_EXT_blend_equation_separate
  GL_NV_framebuffer_multisample_coverage GL_EXT_provoking_vertex
  GL_ARB_point_parameters GL_EXT_texture_env_dot3 GL_OES_texture_float
  GL_EXT_multi_draw_arrays GL_ARB_map_buffer_alignment
  GL_EXT_texture_compression_dxt1 GL_KTX_buffer_region GL_NV_copy_image
  GL_EXT_texture_array GL_EXT_texture_env_combine
  GL_NV_texture_lod_clamp GL_NV_fog_distance GL_NV_fbo_color_attachments
  GL_EXT_packed_depth_stencil GL_ARB_vertex_program
  GL_OES_texture_float_linear GL_ARB_texture_env_dot3 GL_NV_gpu_program4
  GL_EXT_bgra GL_NV_float_buffer GL_ARB_texture_rgb10_a2ui
  GL_NV_texture_env_combine4 GL_ARB_conservative_depth
  GL_ARB_framebuffer_sRGB GL_ARB_vertex_array_object
  GL_ARB_texture_env_combine GL_ARB_vertex_buffer_object
  GL_ARB_map_buffer_range GL_EXT_shadow_funcs GL_NV_vertex_array_range
  GL_ARB_geometry_shader4 GL_NV_texture_expand_normal
  GL_OES_vertex_half_float GL_EXT_separate_specular_color
  GL_EXT_texture_env_add GL_ARB_texture_buffer_object
  GL_EXT_texture_mirror_clamp GL_EXT_timer_query GL_NV_fragdepth
  GL_EXT_vertex_array_bgra GL_NV_multisample_filter_hint
  GL_SUN_slice_accum GL_ARB_get_program_binary GL_SGIS_texture_lod
  GL_EXT_geometry_shader4 GL_EXT_texture_compression_latc
  GL_ARB_point_sprite GL_ARB_shading_language_100 GL_NV_vertex_program2
  GL_ARB_vertex_shader GL_ARB_half_float_pixel GL_EXT_bindable_uniform
  GL_ARB_vertex_array_bgra GL_ARB_ES2_compatibility
  GL_NV_register_combiners GL_ARB_draw_buffers
  GL_ARB_fragment_program_shadow GL_NV_half_float GL_EXT_packed_float
  GL_ATI_texture_mirror_once GL_IBM_rasterpos_clip GL_EXT_texture_sRGB
  GL_EXT_stencil_two_side GL_SGIX_shadow GL_OES_texture_npot
  GL_ARB_draw_instanced GL_NV_explicit_multisample
  GL_ARB_shader_bit_encoding GL_EXT_compiled_vertex_array
  GL_NV_texture_barrier GL_NV_fragment_program2 GL_NV_depth_buffer_float
  GL_EXT_point_parameters GL_EXT_texture_swizzle GL_OES_depth32
  GL_ARB_texture_rg GL_ARB_vertex_type_2_10_10_10_rev
  GL_ARB_texture_float GL_ARB_compressed_texture_pixel_storage
  GL_ARB_depth_clamp GL_ARB_fragment_shader GL_ATI_texture_float
  GL_NV_texture_shader GL_NV_pixel_data_range
  GL_EXT_separate_shader_objects GL_ARB_imaging GL_EXT_draw_buffers2
  GL_ARB_shading_language_include GL_NV_texture_multisample
  GL_ARB_fragment_program GL_ARB_shader_objects
  GL_ARB_framebuffer_object GL_EXT_framebuffer_object GL_NV_point_sprite
  GL_NV_blend_square GL_EXT_secondary_color
  GL_ARB_texture_non_power_of_two GL_EXT_texture_sRGB_decode
  GL_ARB_shading_language_420pack GL_NV_primitive_restart
  GL_ARB_seamless_cube_map GL_ARB_texture_storage
  GL_EXT_pixel_buffer_object GL_EXT_abgr GL_OES_depth_texture
  GL_NV_vdpau_interop GL_ARB_texture_rectangle GL_ARB_multisample
  GL_SGIS_generate_mipmap GL_NV_conditional_render
  GL_EXT_texture_filter_anisotropic GL_ARB_robustness
  GL_NV_light_max_exponent GL_EXT_blend_minmax GL_EXT_framebuffer_blit
  GL_OES_depth24 GL_NV_complex_primitives GL_ARB_texture_env_crossbar
  GL_EXT_texture_storage GL_NV_vertex_program3 GL_NV_path_rendering
  GL_ARB_base_instance GL_OES_mapbuffer GL_EXT_x11_sync_object
  GL_ARB_blend_func_extended GL_ARB_sync GL_OES_element_index_uint
  GL_ARB_color_buffer_float GL_EXT_texture_edge_clamp
  GL_EXT_texture_compression_rgtc GL_ARB_window_pos
  GL_ARB_internalformat_query GL_ARB_shadow
  GL_ARB_texture_mirrored_repeat GL_NV_shader_buffer_load
  GL_EXT_texture_integer GL_EXT_gpu_program_parameters
  GL_ARB_texture_multisample GL_NV_geometry_shader4 GL_S3_s3tc
  GL_NV_vertex_program1_1 GL_ARB_texture_compression_rgtc
  GL_NV_copy_depth_to_color GL_NV_texture_shader3
  GL_EXT_framebuffer_multisample GL_EXT_texture_shared_exponent
  GL_NV_texture_shader2 GL_EXT_texture3D GL_ARB_multitexture
  GL_EXT_draw_instanced GL_OES_texture_3D
  GL_ARB_draw_elements_base_vertex GL_ARB_viewport_array
  GL_ARB_separate_shader_objects GL_EXT_texture_lod GL_ATI_draw_buffers
  GL_NV_parameter_buffer_object2 GL_EXT_depth_bounds_test
  GL_EXT_rescale_normal GL_NV_register_combiners2
  GL_NV_transform_feedback GL_NV_occlusion_query GL_ARB_texture_env_add
  GL_NVX_gpu_memory_info GL_NV_fragment_program
  GL_EXT_texture_type_2_10_10_10_REV GL_ARB_sampler_objects
  GL_ARB_timer_query GL_EXT_texture_cube_map
  GL_NV_parameter_buffer_object GL_EXT_packed_pixels
  GL_EXT_texture_lod_bias GL_EXT_draw_range_elements
  GL_ARB_pixel_buffer_object GL_ARB_compatibility
  GL_ARB_uniform_buffer_object
GLU version: 1.3
GLU extensions:
  GLU_EXT_nurbs_tessellator GLU_EXT_object_space_tess

Context is XlibContextARB()
GLX is direct
GLX server vendor: NVIDIA Corporation
GLX server version: 1.4
GLX server extensions:
  GLX_EXT_visual_info GLX_EXT_visual_rating GLX_SGIX_fbconfig
  GLX_SGIX_pbuffer GLX_SGI_video_sync GLX_SGI_swap_control
  GLX_EXT_swap_control GLX_EXT_texture_from_pixmap
  GLX_ARB_create_context GLX_ARB_create_context_profile
  GLX_EXT_create_context_es2_profile GLX_ARB_create_context_robustness
  GLX_ARB_multisample GLX_NV_float_buffer GLX_ARB_fbconfig_float
  GLX_EXT_framebuffer_sRGB
GLX client vendor: NVIDIA Corporation
GLX client version: 1.4
GLX client extensions:
  GLX_ARB_get_proc_address GLX_ARB_multisample GLX_EXT_visual_info
  GLX_EXT_visual_rating GLX_EXT_import_context GLX_SGI_video_sync
  GLX_NV_swap_group GLX_NV_video_out GLX_SGIX_fbconfig GLX_SGIX_pbuffer
  GLX_SGI_swap_control GLX_EXT_swap_control GLX_ARB_create_context
  GLX_ARB_create_context_profile GLX_NV_float_buffer
  GLX_ARB_fbconfig_float GLX_EXT_fbconfig_packed_float
  GLX_EXT_texture_from_pixmap GLX_EXT_framebuffer_sRGB
  GLX_NV_present_video GLX_NV_copy_image GLX_NV_multisample_coverage
  GLX_NV_video_capture GLX_EXT_create_context_es2_profile
  GLX_ARB_create_context_robustness
GLX extensions:
  GLX_EXT_visual_info GLX_EXT_visual_rating GLX_SGIX_fbconfig
  GLX_SGIX_pbuffer GLX_SGI_video_sync GLX_SGI_swap_control
  GLX_EXT_swap_control GLX_EXT_texture_from_pixmap
  GLX_ARB_create_context GLX_ARB_create_context_profile
  GLX_EXT_create_context_es2_profile GLX_ARB_create_context_robustness
  GLX_ARB_multisample GLX_NV_float_buffer GLX_ARB_fbconfig_float
  GLX_EXT_framebuffer_sRGB GLX_ARB_get_proc_address

Any additional info (platform/language/hardware) that may be relevant?

Original issue reported on code.google.com by rob.mcmu...@gmail.com on 29 Mar 2012 at 1:46

GoogleCodeExporter commented 9 years ago
I'm getting a crash in gl/base.py that I'm guessing is a race condition caused 
by the garbage collector.  VertexBufferObject.__del__ calls 
Context.delete_buffer, which puts an id in a list.  Context.set_current 
attempts to free some resources and uses:

buffers = (gl.GLuint * len(buffers))(*buffers)

What I'm guessing is happening is that the garbage collector is running between 
the call to len(buffers) and the *buffers, resulting in different lengths of 
the list.  I instrumented the method with the attached patch and got the 
following:

doomed buffers race condition!
105 buffers now: [3L, 2L, 1L, 9L, 8L, 7L, 15L, 14L, 13L, 21L, 20L, 19L, 33L, 
32L, 31L, 42L, 41L, 40L, 48L, 47L, 46L, 57L, 56L, 55L, 6L, 5L, 4L, 12L, 11L, 
10L, 18L, 17L, 16L, 30L, 29L, 28L, 36L, 35L, 34L, 45L, 44L, 43L, 54L, 53L, 52L, 
60L, 59L, 58L, 63L, 62L, 61L, 69L, 68L, 67L, 75L, 74L, 73L, 84L, 83L, 82L, 90L, 
89L, 88L, 96L, 95L, 94L, 102L, 101L, 100L, 108L, 107L, 106L, 114L, 113L, 112L, 
120L, 119L, 118L, 72L, 71L, 70L, 78L, 77L, 76L, 87L, 86L, 85L, 93L, 92L, 91L, 
99L, 98L, 97L, 105L, 104L, 103L, 111L, 110L, 109L, 117L, 116L, 115L, 123L, 
122L, 121L]
78 buffers before: [3L, 2L, 1L, 9L, 8L, 7L, 15L, 14L, 13L, 21L, 20L, 19L, 33L, 
32L, 31L, 42L, 41L, 40L, 48L, 47L, 46L, 57L, 56L, 55L, 6L, 5L, 4L, 12L, 11L, 
10L, 18L, 17L, 16L, 30L, 29L, 28L, 36L, 35L, 34L, 45L, 44L, 43L, 54L, 53L, 52L, 
60L, 59L, 58L, 63L, 62L, 61L, 69L, 68L, 67L, 75L, 74L, 73L, 84L, 83L, 82L, 90L, 
89L, 88L, 96L, 95L, 94L, 102L, 101L, 100L, 108L, 107L, 106L, 114L, 113L, 112L, 
120L, 119L, 118L]

Original comment by rob.mcmu...@gmail.com on 29 Mar 2012 at 1:49

Attachments:

GoogleCodeExporter commented 9 years ago
I imagine the same problem affects the _doomed_textures list as well.  The 
enclosed patch seems to work for me, given that list slicing is an atomic 
operation 
(http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm
) and therefore the garbage collector running during the removal of the deleted 
buffers won't lose any data.

Original comment by rob.mcmu...@gmail.com on 29 Mar 2012 at 1:55

Attachments:

GoogleCodeExporter commented 9 years ago
Thanks for your patch, applied as rev. 909138f671fb

Original comment by andreas....@gmail.com on 14 Apr 2012 at 11:48

GoogleCodeExporter commented 9 years ago
The problem still persists in version 1.1.4. The affected sources however are 
not in base.py but in pyglet/gl/__init__.py. Applying exactly the same patch to 
this file fixes the problem.

Original comment by mherrman...@gmail.com on 10 Jan 2014 at 6:40