Pull up following revision(s) (requested by riastradh in ticket #1158): xsrc/external/mit/MesaLib/dist/src/mesa/main/extensions.c: revision 1.2 xsrc/external/mit/MesaLib/dist/src/egl/main/eglglobals.c: revision 1.2 xsrc/external/mit/MesaLib/dist/src/glsl/glsl_parser_extras.cpp: revision 1.2 xsrc/external/mit/MesaLib/dist/src/mesa/main/context.c: revision 1.5 Replace atexit() calls by destructor attributes - this shared library is dlopen/dlclose'd !diff -r1.1.1.3.2.1 -r1.1.1.3.2.2 xsrc/external/mit/MesaLib/dist/src/egl/main/eglglobals.c
(snj)
--- xsrc/external/mit/MesaLib/dist/src/egl/main/eglglobals.c 2015/01/05 20:58:29 1.1.1.3.2.1
+++ xsrc/external/mit/MesaLib/dist/src/egl/main/eglglobals.c 2016/04/15 08:55:43 1.1.1.3.2.2
@@ -56,42 +56,43 @@ struct _egl_global _eglGlobal = | @@ -56,42 +56,43 @@ struct _egl_global _eglGlobal = | |||
56 | true, /* EGL_EXT_platform_x11 */ | 56 | true, /* EGL_EXT_platform_x11 */ | |
57 | true, /* EGL_EXT_platform_wayland */ | 57 | true, /* EGL_EXT_platform_wayland */ | |
58 | true /* EGL_MESA_platform_gbm */ | 58 | true /* EGL_MESA_platform_gbm */ | |
59 | }, | 59 | }, | |
60 | 60 | |||
61 | /* ClientExtensionsString */ | 61 | /* ClientExtensionsString */ | |
62 | "EGL_EXT_client_extensions" | 62 | "EGL_EXT_client_extensions" | |
63 | " EGL_EXT_platform_base" | 63 | " EGL_EXT_platform_base" | |
64 | " EGL_EXT_platform_x11" | 64 | " EGL_EXT_platform_x11" | |
65 | " EGL_EXT_platform_wayland" | 65 | " EGL_EXT_platform_wayland" | |
66 | " EGL_MESA_platform_gbm" | 66 | " EGL_MESA_platform_gbm" | |
67 | }; | 67 | }; | |
68 | 68 | |||
69 | static EGLBoolean registered = EGL_FALSE; | |||
69 | 70 | |||
70 | static void | 71 | static void __attribute__((__destructor__)) | |
71 | _eglAtExit(void) | 72 | _eglAtExit(void) | |
72 | { | 73 | { | |
73 | EGLint i; | 74 | EGLint i; | |
75 | ||||
76 | if (!registered) | |||
77 | return; | |||
78 | ||||
74 | for (i = _eglGlobal.NumAtExitCalls - 1; i >= 0; i--) | 79 | for (i = _eglGlobal.NumAtExitCalls - 1; i >= 0; i--) | |
75 | _eglGlobal.AtExitCalls[i](); | 80 | _eglGlobal.AtExitCalls[i](); | |
76 | } | 81 | } | |
77 | 82 | |||
78 | 83 | |||
79 | void | 84 | void | |
80 | _eglAddAtExitCall(void (*func)(void)) | 85 | _eglAddAtExitCall(void (*func)(void)) | |
81 | { | 86 | { | |
82 | if (func) { | 87 | if (func) { | |
83 | static EGLBoolean registered = EGL_FALSE; | |||
84 | 88 | |||
85 | _eglLockMutex(_eglGlobal.Mutex); | 89 | _eglLockMutex(_eglGlobal.Mutex); | |
86 | 90 | |||
87 | if (!registered) { | 91 | registered = EGL_TRUE; | |
88 | atexit(_eglAtExit); | |||
89 | registered = EGL_TRUE; | |||
90 | } | |||
91 | 92 | |||
92 | assert(_eglGlobal.NumAtExitCalls < ARRAY_SIZE(_eglGlobal.AtExitCalls)); | 93 | assert(_eglGlobal.NumAtExitCalls < ARRAY_SIZE(_eglGlobal.AtExitCalls)); | |
93 | _eglGlobal.AtExitCalls[_eglGlobal.NumAtExitCalls++] = func; | 94 | _eglGlobal.AtExitCalls[_eglGlobal.NumAtExitCalls++] = func; | |
94 | 95 | |||
95 | _eglUnlockMutex(_eglGlobal.Mutex); | 96 | _eglUnlockMutex(_eglGlobal.Mutex); | |
96 | } | 97 | } | |
97 | } | 98 | } |
--- xsrc/external/mit/MesaLib/dist/src/glsl/Attic/glsl_parser_extras.cpp 2015/01/05 20:59:01 1.1.1.1.2.1
+++ xsrc/external/mit/MesaLib/dist/src/glsl/Attic/glsl_parser_extras.cpp 2016/04/15 08:55:43 1.1.1.1.2.2
@@ -1607,27 +1607,27 @@ do_common_optimization(exec_list *ir, bo | @@ -1607,27 +1607,27 @@ do_common_optimization(exec_list *ir, bo | |||
1607 | 1607 | |||
1608 | return progress; | 1608 | return progress; | |
1609 | } | 1609 | } | |
1610 | 1610 | |||
1611 | extern "C" { | 1611 | extern "C" { | |
1612 | 1612 | |||
1613 | /** | 1613 | /** | |
1614 | * To be called at GL teardown time, this frees compiler datastructures. | 1614 | * To be called at GL teardown time, this frees compiler datastructures. | |
1615 | * | 1615 | * | |
1616 | * After calling this, any previously compiled shaders and shader | 1616 | * After calling this, any previously compiled shaders and shader | |
1617 | * programs would be invalid. So this should happen at approximately | 1617 | * programs would be invalid. So this should happen at approximately | |
1618 | * program exit. | 1618 | * program exit. | |
1619 | */ | 1619 | */ | |
1620 | void | 1620 | void __attribute__((__destructor__)) | |
1621 | _mesa_destroy_shader_compiler(void) | 1621 | _mesa_destroy_shader_compiler(void) | |
1622 | { | 1622 | { | |
1623 | _mesa_destroy_shader_compiler_caches(); | 1623 | _mesa_destroy_shader_compiler_caches(); | |
1624 | 1624 | |||
1625 | _mesa_glsl_release_types(); | 1625 | _mesa_glsl_release_types(); | |
1626 | } | 1626 | } | |
1627 | 1627 | |||
1628 | /** | 1628 | /** | |
1629 | * Releases compiler caches to trade off performance for memory. | 1629 | * Releases compiler caches to trade off performance for memory. | |
1630 | * | 1630 | * | |
1631 | * Intended to be used with glReleaseShaderCompiler(). | 1631 | * Intended to be used with glReleaseShaderCompiler(). | |
1632 | */ | 1632 | */ | |
1633 | void | 1633 | void |
--- xsrc/external/mit/MesaLib/dist/src/mesa/main/context.c 2015/01/05 20:59:18 1.2.2.1
+++ xsrc/external/mit/MesaLib/dist/src/mesa/main/context.c 2016/04/15 08:55:43 1.2.2.2
@@ -420,27 +420,29 @@ one_time_init( struct gl_context *ctx ) | @@ -420,27 +420,29 @@ one_time_init( struct gl_context *ctx ) | |||
420 | if (!(api_init_mask & (1 << ctx->API))) { | 420 | if (!(api_init_mask & (1 << ctx->API))) { | |
421 | _mesa_init_get_hash(ctx); | 421 | _mesa_init_get_hash(ctx); | |
422 | 422 | |||
423 | _mesa_init_remap_table(); | 423 | _mesa_init_remap_table(); | |
424 | } | 424 | } | |
425 | 425 | |||
426 | api_init_mask |= 1 << ctx->API; | 426 | api_init_mask |= 1 << ctx->API; | |
427 | 427 | |||
428 | mtx_unlock(&OneTimeLock); | 428 | mtx_unlock(&OneTimeLock); | |
429 | 429 | |||
430 | /* Hopefully atexit() is widely available. If not, we may need some | 430 | /* Hopefully atexit() is widely available. If not, we may need some | |
431 | * #ifdef tests here. | 431 | * #ifdef tests here. | |
432 | */ | 432 | */ | |
433 | #if 0 /* using destructor instead */ | |||
433 | atexit(_mesa_destroy_shader_compiler); | 434 | atexit(_mesa_destroy_shader_compiler); | |
435 | #endif | |||
434 | 436 | |||
435 | dummy_enum_func(); | 437 | dummy_enum_func(); | |
436 | } | 438 | } | |
437 | 439 | |||
438 | 440 | |||
439 | /** | 441 | /** | |
440 | * Initialize fields of gl_current_attrib (aka ctx->Current.*) | 442 | * Initialize fields of gl_current_attrib (aka ctx->Current.*) | |
441 | */ | 443 | */ | |
442 | static void | 444 | static void | |
443 | _mesa_init_current(struct gl_context *ctx) | 445 | _mesa_init_current(struct gl_context *ctx) | |
444 | { | 446 | { | |
445 | GLuint i; | 447 | GLuint i; | |
446 | 448 |
--- xsrc/external/mit/MesaLib/dist/src/mesa/main/extensions.c 2015/01/05 20:59:18 1.1.1.5.2.1
+++ xsrc/external/mit/MesaLib/dist/src/mesa/main/extensions.c 2016/04/15 08:55:44 1.1.1.5.2.2
@@ -562,49 +562,49 @@ get_extension_override( struct gl_contex | @@ -562,49 +562,49 @@ get_extension_override( struct gl_contex | |||
562 | _mesa_problem(ctx, "Trying to enable unknown extensions: %s", | 562 | _mesa_problem(ctx, "Trying to enable unknown extensions: %s", | |
563 | extra_extensions); | 563 | extra_extensions); | |
564 | return strdup(extra_extensions); | 564 | return strdup(extra_extensions); | |
565 | } | 565 | } | |
566 | } | 566 | } | |
567 | 567 | |||
568 | 568 | |||
569 | /** | 569 | /** | |
570 | * \brief Free extra_extensions and cant_disable_extensions strings | 570 | * \brief Free extra_extensions and cant_disable_extensions strings | |
571 | * | 571 | * | |
572 | * These strings are allocated early during the first context creation by | 572 | * These strings are allocated early during the first context creation by | |
573 | * _mesa_one_time_init_extension_overrides. | 573 | * _mesa_one_time_init_extension_overrides. | |
574 | */ | 574 | */ | |
575 | static void | 575 | static void __attribute__((__destructor__)) | |
576 | free_unknown_extensions_strings(void) | 576 | free_unknown_extensions_strings(void) | |
577 | { | 577 | { | |
578 | free(extra_extensions); | 578 | free(extra_extensions); | |
579 | free(cant_disable_extensions); | 579 | free(cant_disable_extensions); | |
580 | } | 580 | } | |
581 | 581 | |||
582 | 582 | |||
583 | /** | 583 | /** | |
584 | * \brief Initialize extension override tables. | 584 | * \brief Initialize extension override tables. | |
585 | * | 585 | * | |
586 | * This should be called one time early during first context initialization. | 586 | * This should be called one time early during first context initialization. | |
587 | */ | 587 | */ | |
588 | void | 588 | void | |
589 | _mesa_one_time_init_extension_overrides(void) | 589 | _mesa_one_time_init_extension_overrides(void) | |
590 | { | 590 | { | |
591 | const char *env_const = _mesa_getenv("MESA_EXTENSION_OVERRIDE"); | 591 | const char *env_const = _mesa_getenv("MESA_EXTENSION_OVERRIDE"); | |
592 | char *env; | 592 | char *env; | |
593 | char *ext; | 593 | char *ext; | |
594 | int len; | 594 | int len; | |
595 | size_t offset; | 595 | size_t offset; | |
596 | 596 | |||
597 | atexit(free_unknown_extensions_strings); | 597 | /* atexit(free_unknown_extensions_strings); */ | |
598 | 598 | |||
599 | memset(&_mesa_extension_override_enables, 0, sizeof(struct gl_extensions)); | 599 | memset(&_mesa_extension_override_enables, 0, sizeof(struct gl_extensions)); | |
600 | memset(&_mesa_extension_override_disables, 0, sizeof(struct gl_extensions)); | 600 | memset(&_mesa_extension_override_disables, 0, sizeof(struct gl_extensions)); | |
601 | 601 | |||
602 | if (env_const == NULL) { | 602 | if (env_const == NULL) { | |
603 | return; | 603 | return; | |
604 | } | 604 | } | |
605 | 605 | |||
606 | /* extra_exts: List of unrecognized extensions. */ | 606 | /* extra_exts: List of unrecognized extensions. */ | |
607 | extra_extensions = calloc(ALIGN(strlen(env_const) + 2, 4), sizeof(char)); | 607 | extra_extensions = calloc(ALIGN(strlen(env_const) + 2, 4), sizeof(char)); | |
608 | cant_disable_extensions = calloc(ALIGN(strlen(env_const) + 2, 4), sizeof(char)); | 608 | cant_disable_extensions = calloc(ALIGN(strlen(env_const) + 2, 4), sizeof(char)); | |
609 | 609 | |||
610 | /* Copy env_const because strtok() is destructive. */ | 610 | /* Copy env_const because strtok() is destructive. */ |