mesa/src/util
Rob Clark 6fb7935ded util/queue: don't hang at exit
So atexit() is horrible and 4aea8fe7 is probably not a good idea.  But
add an extra layer of duct-tape to the problem.  Otherwise we hit a
situation where app using an atexit() handler that runs later than ours
doesn't hang when trying to tear down a context.

 (gdb) bt
 #0  util_queue_killall_and_wait (queue=queue@entry=0x52bc80) at ../../../src/util/u_queue.c:264
 #1  0x0000007fb6c380c0 in atexit_handler () at ../../../src/util/u_queue.c:51
 #2  0x0000007fb7730e2c in __run_exit_handlers () from /lib64/libc.so.6
 #3  0x0000007fb7730e5c in exit () from /lib64/libc.so.6
 #4  0x0000007fb7ce17dc in piglit_report_result (result=PIGLIT_PASS) at /home/robclark/src/piglit/tests/util/piglit-util.c:267
 #5  0x0000007fb7ef99f8 in process_next_event (x11_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_x11_framework.c:139
 #6  0x0000007fb7ef9a90 in enter_event_loop (winsys_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_x11_framework.c:153
 #7  0x0000007fb7ef8e50 in run_test (gl_fw=0x432c20, argc=1, argv=0x7ffffff588) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_winsys_framework.c:88
 #8  0x0000007fb7edb890 in piglit_gl_test_run (argc=1, argv=0x7ffffff588, config=0x7ffffff400) at /home/robclark/src/piglit/tests/util/piglit-framework-gl.c:203
 #9  0x0000000000401224 in main (argc=1, argv=0x7ffffff588) at /home/robclark/src/piglit/tests/bugs/drawbuffer-modes.c:46
 (gdb) c
 Continuing.
 [Thread 0x7fb67580c0 (LWP 3471) exited]
 ^C
 Thread 1 "drawbuffer-mode" received signal SIGINT, Interrupt.
 0x0000007fb72dda34 in pthread_cond_wait@@GLIBC_2.17 () from /lib64/libpthread.so.0
 (gdb) bt
 #0  0x0000007fb72dda34 in pthread_cond_wait@@GLIBC_2.17 () from /lib64/libpthread.so.0
 #1  0x0000007fb6c38304 in cnd_wait (mtx=0x5bdc90, cond=0x5bdcc0) at ../../../include/c11/threads_posix.h:159
 #2  util_queue_fence_wait (fence=0x5bdc90) at ../../../src/util/u_queue.c:106
 #3  0x0000007fb6daac70 in fd_batch_sync (batch=0x5bdc70) at ../../../../../src/gallium/drivers/freedreno/freedreno_batch.c:233
 #4  batch_reset (batch=batch@entry=0x5bdc70) at ../../../../../src/gallium/drivers/freedreno/freedreno_batch.c:183
 #5  0x0000007fb6daa5e0 in batch_flush (batch=0x5bdc70) at ../../../../../src/gallium/drivers/freedreno/freedreno_batch.c:290
 #6  fd_batch_flush (batch=0x5bdc70, sync=<optimized out>) at ../../../../../src/gallium/drivers/freedreno/freedreno_batch.c:308
 #7  0x0000007fb6daba2c in fd_bc_flush (cache=0x461220, ctx=0x52b920) at ../../../../../src/gallium/drivers/freedreno/freedreno_batch_cache.c:141
 #8  0x0000007fb6dac954 in fd_context_flush (pctx=0x52b920, fence=0x0, flags=<optimized out>) at ../../../../../src/gallium/drivers/freedreno/freedreno_context.c:54
 #9  0x0000007fb6b43294 in st_glFlush (ctx=<optimized out>) at ../../../src/mesa/state_tracker/st_cb_flush.c:121
 #10 0x0000007fb69a84e8 in _mesa_make_current (newCtx=newCtx@entry=0x0, drawBuffer=drawBuffer@entry=0x0, readBuffer=readBuffer@entry=0x0) at ../../../src/mesa/main/context.c:1654
 #11 0x0000007fb6b7ca58 in st_api_make_current (stapi=<optimized out>, stctxi=0x0, stdrawi=0x0, streadi=0x0) at ../../../src/mesa/state_tracker/st_manager.c:827
 #12 0x0000007fb6cc87e8 in dri_unbind_context (cPriv=<optimized out>) at ../../../../../src/gallium/state_trackers/dri/dri_context.c:217
 #13 0x0000007fb6cc80b0 in driUnbindContext (pcp=0x5271e0) at ../../../../../../src/mesa/drivers/dri/common/dri_util.c:591
 #14 0x0000007fb7d1da08 in MakeContextCurrent (dpy=0x433380, draw=0, read=0, gc_user=0x0) at ../../../src/glx/glxcurrent.c:214
 #15 0x0000007fb7a8d5e0 in glx_platform_make_current () from /lib64/libwaffle-1.so.0
 #16 0x0000007fb7a894e4 in waffle_make_current () from /lib64/libwaffle-1.so.0
 #17 0x0000007fb7ef8c60 in piglit_wfl_framework_teardown (wfl_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_wfl_framework.c:628
 #18 0x0000007fb7ef939c in piglit_winsys_framework_teardown (winsys_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_winsys_framework.c:238
 #19 0x0000007fb7ef9c30 in destroy (gl_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_x11_framework.c:212
 #20 0x0000007fb7edb7c4 in destroy () at /home/robclark/src/piglit/tests/util/piglit-framework-gl.c:184
 #21 0x0000007fb7730e2c in __run_exit_handlers () from /lib64/libc.so.6
 #22 0x0000007fb7730e5c in exit () from /lib64/libc.so.6
 #23 0x0000007fb7ce17dc in piglit_report_result (result=PIGLIT_PASS) at /home/robclark/src/piglit/tests/util/piglit-util.c:267
 #24 0x0000007fb7ef99f8 in process_next_event (x11_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_x11_framework.c:139
 #25 0x0000007fb7ef9a90 in enter_event_loop (winsys_fw=0x432c20) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_x11_framework.c:153
 #26 0x0000007fb7ef8e50 in run_test (gl_fw=0x432c20, argc=1, argv=0x7ffffff588) at /home/robclark/src/piglit/tests/util/piglit-framework-gl/piglit_winsys_framework.c:88
 #27 0x0000007fb7edb890 in piglit_gl_test_run (argc=1, argv=0x7ffffff588, config=0x7ffffff400) at /home/robclark/src/piglit/tests/util/piglit-framework-gl.c:203
 #28 0x0000000000401224 in main (argc=1, argv=0x7ffffff588) at /home/robclark/src/piglit/tests/bugs/drawbuffer-modes.c:46
 (gdb) r

Fixes: 4aea8fe7 ("gallium/u_queue: fix random crashes when the app calls exit()")
Signed-off-by: Rob Clark <robdclark@gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
2017-04-18 16:32:00 -04:00
..
sha1 util/sha1: add non-typedef name for the SHA1_CTX struct 2017-03-15 11:15:53 +00:00
tests/hash_table mesa: Add .gitignore entries for make check binaries 2016-05-25 09:41:44 -07:00
.gitignore mesa: Add .gitignore entries for make check binaries 2016-05-25 09:41:44 -07:00
Android.mk Android: remove host libmesa_util 2017-03-22 17:52:23 +00:00
bitscan.c util/bitscan: use correct signature for ffs/ffsll 2017-03-13 11:16:34 +00:00
bitscan.h util/bitscan: use correct signature for ffs/ffsll 2017-03-13 11:16:34 +00:00
bitset.h util/bitset: Allow iterating over const bitsets 2016-03-24 15:20:44 -07:00
build_id.c util/build-id: check dlpi_name before strstr call 2017-03-17 07:34:26 +02:00
build_id.h util: consistently use ifndef guards over pragma once 2017-03-22 16:55:22 +00:00
crc32.c util: import CRC32 implementation from gallium 2016-11-22 18:05:51 +01:00
crc32.h util: import CRC32 implementation from gallium 2016-11-22 18:05:51 +01:00
debug.c util: move brw_env_var_as_boolean() to util 2015-11-24 10:02:55 -05:00
debug.h util: Include <stdbool.h> in debug.h. 2015-11-24 10:05:32 -08:00
disk_cache.c util/disk_cache: don't deadlock on premature EOF 2017-03-25 13:08:37 +11:00
disk_cache.h util/disk_cache: hash pointer size and gpu name into cache keys 2017-03-24 11:20:09 +11:00
format_r11g11b10f.h util: consistently use ifndef guards over pragma once 2017-03-22 16:55:22 +00:00
format_rgb9e5.h util/format: Use explicitly sized types 2016-08-05 09:07:04 -07:00
format_srgb.h util: Tiny optimisation for the linear→srgb conversion 2015-11-27 10:55:22 +01:00
format_srgb.py util: remove shebang from format_srgb.py 2017-03-10 14:12:48 +00:00
half_float.c glsl: move half<->float convertion to util 2015-10-16 19:33:37 -04:00
half_float.h glsl: move half<->float convertion to util 2015-10-16 19:33:37 -04:00
hash_table.c util: add assert that key cannot be NULL on insertion 2016-08-22 07:37:55 +03:00
hash_table.h util: Move hash_table_call_foreach to util hash table 2016-09-12 10:48:35 +10:00
list.h util: #include "c99_compat.h" to fix Windows build 2017-04-03 13:09:05 -06:00
macros.h mesa: removed redundant #else 2016-11-21 12:44:46 -06:00
Makefile.am util/disk_cache: compress individual cache entries 2017-03-03 12:09:08 +11:00
Makefile.sources util/u_atomic: provide 64bit atomics where they're missing 2017-04-03 10:52:41 -07:00
mesa-sha1.c util/sha1: harmonize _mesa_sha1_* wrappers 2017-03-22 11:33:51 +00:00
mesa-sha1.h util: #include "c99_compat.h" to fix Windows build 2017-04-03 13:09:05 -06:00
ralloc.c ralloc: don't leave out the alignment factor 2017-03-06 11:28:48 -08:00
ralloc.h ralloc: Delete autofree handling. 2017-02-27 15:46:12 -08:00
rand_xor.c util/rand_xor: add function to seed rand 2017-03-23 08:16:29 +11:00
rand_xor.h util/rand_xor: add function to seed rand 2017-03-23 08:16:29 +11:00
register_allocate.c util/ra: (trivial) fix c99 loop variable initialization 2015-08-19 04:17:49 +02:00
register_allocate.h util: consistently use ifndef guards over pragma once 2017-03-22 16:55:22 +00:00
rgtc.c util: move shared rgtc code to util (v2) 2014-09-17 11:27:25 +10:00
rgtc.h util: move shared rgtc code to util (v2) 2014-09-17 11:27:25 +10:00
roundeven_test.c util: Add a roundeven test. 2015-03-18 21:06:26 -07:00
rounding.h util: try to use SSE instructions with MSVC and 32-bit gcc 2016-08-17 12:53:20 -06:00
SConscript util: import sha1 implementation from OpenBSD 2017-01-18 19:07:23 +00:00
set.c util/set: don't compare against deleted entries 2016-02-02 14:42:32 -05:00
set.h util/hash_set: Rework the API to know about hashing 2015-01-15 13:21:27 -08:00
simple_list.h mesa: Port a variant of 68afbe89c7 to util/ 2015-01-28 16:33:34 -08:00
slab.c util: remove unused variable 2016-10-07 21:24:50 +11:00
slab.h util/slab: re-design to allow migration between pools (v3) 2016-10-05 15:40:40 +02:00
string_to_uint_map.cpp mesa/glsl: Move string_to_uint_map into the util folder 2016-09-12 10:48:35 +10:00
string_to_uint_map.h mesa/glsl: Move string_to_uint_map into the util folder 2016-09-12 10:48:35 +10:00
strndup.h util/strndup: move header inclusion as applicable 2017-03-22 16:55:23 +00:00
strtod.c mesa/main: free locale at exit 2015-06-29 09:06:40 -07:00
strtod.h mesa/main: free locale at exit 2015-06-29 09:06:40 -07:00
texcompress_rgtc_tmp.h util: move shared rgtc code to util (v2) 2014-09-17 11:27:25 +10:00
u_atomic.c util/u_atomic: provide 64bit atomics where they're missing 2017-04-03 10:52:41 -07:00
u_atomic.h util: use GCC atomic intrinsics with explicit memory model 2016-10-05 15:39:39 +02:00
u_atomic_test.c util: fix comment typo 2015-12-04 14:06:41 +00:00
u_endian.h u_endian: add android to glibc clause 2016-09-13 10:04:13 +10:00
u_queue.c util/queue: don't hang at exit 2017-04-18 16:32:00 -04:00
u_queue.h util/u_queue: make u_queue accessible to cpp 2017-03-13 09:50:26 +11:00
u_string.h gallium/util: move u_string.h to src/util/u_string.h 2017-03-12 17:43:06 +11:00
u_thread.h util/u_thread.h: Include stdint.h for int64_t definition. 2017-03-13 12:23:11 +00:00
u_vector.c util: add vector util code. 2016-10-19 09:05:25 +10:00
u_vector.h util: fix MSVC warning in u_align_u32() 2017-04-03 13:09:05 -06:00
vk_alloc.h util/vk_alloc: Add a vk_zalloc2 helper 2016-11-17 12:03:24 -08:00
vk_util.h util/vk: Add helpers for finding an extension struct 2017-03-15 08:22:02 +10:00