[waffle] [PATCH v2 04/10] nacl: rework nacl_dl functions

Tapani tapani.palli at intel.com
Wed Apr 8 23:47:47 PDT 2015


Reviewed-by: Tapani Pälli <tapani.palli at intel.com>

On 03/25/2015 04:22 PM, Emil Velikov wrote:
> This is a direct copy from cgl with the following tweaks
>   - s/cgl/nacl/
>   - s/cgl_dl_gl_path/NACL_GLES2_LIBRARY/
>   - Add move the nacl_prefix function from nacl_platform.c
>
> Doing this allows us to have more consistent codebase and additional
> error messages for the user. As a bonus it squashes a bug where
> waffle_dl_can_open() was setting an error when it shouldn't have.
>
> v2:
>   - s/gl_dl/dl_gl/ nacl_platform.* : the latter is used throughout waffle
>   - s/cgl_dl_gl_path/NACL_GLES2_LIBRARY/ - missed a couple of references
>   - add missing includes - stdio.h, string.h, nacl_container.h
>
> Cc: Tapani Pälli <tapani.palli at intel.com>
> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
> ---
>
> Tapani, this update addresses only the compilation goofups. This way
> people can give it a test if interested. v3 will be comming after the
> input of my follow up questions.
>
> How did you structure the files for your test [1] ? All the requirements
> (SOs, etc.) are next to the nexe,nmf,html and Chromium is running with
> --enable-nacl, yet nothing pops up. Your test runs like a charm though :-)
>
> Thanks
> Emil
>
> [1] http://koti.kapsi.fi/~tpalli/nacl/
>
>
>   src/waffle/CMakeLists.txt       |   1 +
>   src/waffle/nacl/nacl_dl.c       | 191 ++++++++++++++++++++++++++++++++++++++++
>   src/waffle/nacl/nacl_dl.h       |  43 +++++++++
>   src/waffle/nacl/nacl_platform.c |  86 ++----------------
>   src/waffle/nacl/nacl_platform.h |   2 +-
>   5 files changed, 241 insertions(+), 82 deletions(-)
>   create mode 100644 src/waffle/nacl/nacl_dl.c
>   create mode 100644 src/waffle/nacl/nacl_dl.h
>
> diff --git a/src/waffle/CMakeLists.txt b/src/waffle/CMakeLists.txt
> index ac9b415..758039c 100644
> --- a/src/waffle/CMakeLists.txt
> +++ b/src/waffle/CMakeLists.txt
> @@ -186,6 +186,7 @@ if(waffle_has_nacl)
>           nacl/nacl_config.c
>           nacl/nacl_context.c
>           nacl/nacl_display.c
> +        nacl/nacl_dl.c
>           nacl/nacl_platform.c
>           nacl/nacl_window.c
>           )
> diff --git a/src/waffle/nacl/nacl_dl.c b/src/waffle/nacl/nacl_dl.c
> new file mode 100644
> index 0000000..7337122
> --- /dev/null
> +++ b/src/waffle/nacl/nacl_dl.c
> @@ -0,0 +1,191 @@
> +// Copyright 2012-2015 Intel Corporation
> +//
> +// All rights reserved.
> +//
> +// Redistribution and use in source and binary forms, with or without
> +// modification, are permitted provided that the following conditions are met:
> +//
> +// - Redistributions of source code must retain the above copyright notice, this
> +//   list of conditions and the following disclaimer.
> +//
> +// - Redistributions in binary form must reproduce the above copyright notice,
> +//   this list of conditions and the following disclaimer in the documentation
> +//   and/or other materials provided with the distribution.
> +//
> +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
> +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +#include <assert.h>
> +#include <dlfcn.h>
> +#include <stdio.h>
> +#include <string.h>
> +
> +#include "wcore_error.h"
> +
> +#include "nacl_container.h"
> +#include "nacl_dl.h"
> +#include "nacl_platform.h"
> +
> +
> +static bool
> +nacl_dl_check_enum(int32_t waffle_dl)
> +{
> +    switch (waffle_dl) {
> +        case WAFFLE_DL_OPENGL:
> +            wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM,
> +                         "NACL does not support OpenGL");
> +            return false;
> +        case WAFFLE_DL_OPENGL_ES1:
> +            wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM,
> +                         "NACL does not support OpenGL ES1");
> +            return false;
> +        case WAFFLE_DL_OPENGL_ES2:
> +            return true;
> +        case WAFFLE_DL_OPENGL_ES3:
> +            wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM,
> +                         "NACL does not support OpenGL ES3");
> +            return false;
> +        default:
> +            assert(false);
> +            return false;
> +   }
> +}
> +
> +static bool
> +nacl_dl_open(struct nacl_platform *plat)
> +{
> +    plat->dl_gl = dlopen(NACL_GLES2_LIBRARY, RTLD_LAZY);
> +
> +    if (!plat->dl_gl) {
> +        wcore_errorf(WAFFLE_ERROR_UNKNOWN,
> +                     "dlopen(\"%s\") failed", NACL_GLES2_LIBRARY);
> +        return false;
> +    }
> +
> +    return true;
> +}
> +
> +bool
> +nacl_dl_can_open(struct wcore_platform *wc_plat,
> +                 int32_t waffle_dl)
> +{
> +    struct nacl_platform *plat = nacl_platform(wc_plat);
> +    bool ok;
> +
> +    WCORE_ERROR_DISABLED({
> +        ok = nacl_dl_check_enum(waffle_dl);
> +    });
> +
> +    if (!ok)
> +        return false;
> +
> +    if (plat->dl_gl != NULL)
> +        return true;
> +
> +    WCORE_ERROR_DISABLED({
> +        nacl_dl_open(plat);
> +    });
> +
> +    return plat->dl_gl != NULL;
> +}
> +
> +// Construct a string that maps GL function to NaCl function
> +// by concating given prefix and function name tail from 'src'.
> +static char *
> +nacl_dl_prefix(const char *src, const char *prefix)
> +{
> +    if (strncmp(src, "gl", 2) != 0)
> +        return NULL;
> +
> +    uint32_t len = strlen(src) + strlen(prefix);
> +
> +    char *dst = wcore_calloc(len);
> +    if (!dst)
> +        return NULL;
> +
> +    snprintf(dst, len, "%s%s", prefix, src + 2);
> +
> +    return dst;
> +}
> +
> +void*
> +nacl_dl_sym(struct wcore_platform *wc_plat,
> +            int32_t waffle_dl,
> +            const char *name)
> +{
> +    struct nacl_platform *plat = nacl_platform(wc_plat);
> +
> +    if (!nacl_dl_check_enum(waffle_dl))
> +        return NULL;
> +
> +    if (plat->dl_gl == NULL)
> +        nacl_dl_open(plat);
> +
> +    if (plat->dl_gl == NULL)
> +        return NULL;
> +
> +    char *nacl_name = nacl_dl_prefix(name, "GLES2");
> +    if (!nacl_name)
> +        return NULL;
> +
> +    // Clear any previous error.
> +    dlerror();
> +
> +    void *sym = dlsym(plat->dl_gl, name);
> +
> +    if (sym) {
> +        free(nacl_name);
> +        return sym;
> +    }
> +
> +    // dlsym returned NULL. Check if an error occured.
> +    const char *error = dlerror();
> +    if (error) {
> +        wcore_errorf(WAFFLE_ERROR_UNKNOWN,
> +                     "dlsym(libname=\"%s\", symbol=\"%s\") failed: %s",
> +                     NACL_GLES2_LIBRARY, nacl_name, error);
> +    }
> +    free(nacl_name);
> +
> +    return NULL;
> +}
> +
> +bool
> +nacl_dl_close(struct wcore_platform *wc_plat)
> +{
> +    struct nacl_platform *plat = nacl_platform(wc_plat);
> +
> +    int error_code = 0;
> +    const char *error_msg = NULL;
> +
> +    if (!plat->dl_gl)
> +        return true;
> +
> +    error_code = dlclose(plat->dl_gl);
> +
> +    if (!error_code)
> +        return true;
> +
> +    error_msg = dlerror();
> +
> +    if (error_msg) {
> +        wcore_errorf(WAFFLE_ERROR_UNKNOWN,
> +                     "dlclose(libname=\"%s\") failed: %s",
> +                     NACL_GLES2_LIBRARY, error_msg);
> +    }
> +    else {
> +        wcore_errorf(WAFFLE_ERROR_UNKNOWN,
> +                     "dlclose(libname=\"%s\") failed",
> +                     NACL_GLES2_LIBRARY);
> +    }
> +
> +    return false;
> +}
> diff --git a/src/waffle/nacl/nacl_dl.h b/src/waffle/nacl/nacl_dl.h
> new file mode 100644
> index 0000000..e7748f3
> --- /dev/null
> +++ b/src/waffle/nacl/nacl_dl.h
> @@ -0,0 +1,43 @@
> +// Copyright 2012-2015 Intel Corporation
> +//
> +// All rights reserved.
> +//
> +// Redistribution and use in source and binary forms, with or without
> +// modification, are permitted provided that the following conditions are met:
> +//
> +// - Redistributions of source code must retain the above copyright notice, this
> +//   list of conditions and the following disclaimer.
> +//
> +// - Redistributions in binary form must reproduce the above copyright notice,
> +//   this list of conditions and the following disclaimer in the documentation
> +//   and/or other materials provided with the distribution.
> +//
> +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
> +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +#pragma once
> +
> +#include <stdbool.h>
> +#include <stdint.h>
> +
> +struct wcore_platform;
> +
> +bool
> +nacl_dl_can_open(struct wcore_platform *wc_plat,
> +                 int32_t waffle_dl);
> +
> +void*
> +nacl_dl_sym(struct wcore_platform *wc_plat,
> +            int32_t waffle_dl,
> +            const char *name);
> +
> +bool
> +nacl_dl_close(struct wcore_platform *wc_plat);
> diff --git a/src/waffle/nacl/nacl_platform.c b/src/waffle/nacl/nacl_platform.c
> index 22169da..abaf729 100644
> --- a/src/waffle/nacl/nacl_platform.c
> +++ b/src/waffle/nacl/nacl_platform.c
> @@ -26,6 +26,7 @@
>   #include <dlfcn.h>
>   #include <stdio.h>
>   
> +#include "nacl_dl.h"
>   #include "nacl_platform.h"
>   
>   static const struct wcore_platform_vtbl nacl_platform_vtbl;
> @@ -43,91 +44,14 @@ nacl_platform_destroy(struct wcore_platform *wc_self)
>   
>       nacl_teardown(self->nacl);
>   
> -    if (self->gl_dl)
> -        if (dlclose(self->gl_dl) != 0)
> -            wcore_errorf(WAFFLE_ERROR_UNKNOWN, "dlclose failed: %s",
> -                         dlerror());
> +    if (self->dl_gl)
> +        ok &= nacl_dl_close(&self->wcore);
>   
>       free(self);
>       return ok;
>   }
>   
>   static bool
> -nacl_platform_dl_can_open(struct wcore_platform *wc_self,
> -                          int32_t waffle_dl)
> -{
> -    struct nacl_platform *self = nacl_platform(wc_self);
> -
> -    switch (waffle_dl) {
> -        case WAFFLE_DL_OPENGL_ES2:
> -            if (!self->gl_dl)
> -                self->gl_dl = dlopen(NACL_GLES2_LIBRARY, RTLD_LAZY);
> -            break;
> -        // API not supported
> -        default:
> -            return false;
> -    }
> -
> -    if (!self->gl_dl)
> -        wcore_errorf(WAFFLE_ERROR_UNKNOWN, "dlopen failed: %s", dlerror());
> -
> -    return self->gl_dl ? true : false;
> -}
> -
> -// Construct a string that maps GL function to NaCl function
> -// by concating given prefix and function name tail from 'src'.
> -static char *
> -nacl_prefix(const char *src, const char *prefix)
> -{
> -    if (strncmp(src, "gl", 2) != 0)
> -        return NULL;
> -
> -    uint32_t len = strlen(src) + strlen(prefix);
> -
> -    char *dst = wcore_calloc(len);
> -    if (!dst)
> -        return NULL;
> -
> -    snprintf(dst, len, "%s%s", prefix, src + 2);
> -
> -    return dst;
> -}
> -
> -static void*
> -nacl_platform_dl_sym(struct wcore_platform *wc_self,
> -                     int32_t waffle_dl,
> -                     const char *name)
> -{
> -    struct nacl_platform *self = nacl_platform(wc_self);
> -    char *nacl_name = NULL;
> -    void *func = NULL;
> -
> -    if (!self->gl_dl)
> -        if (!nacl_platform_dl_can_open(wc_self, waffle_dl))
> -            return false;
> -
> -    nacl_name = nacl_prefix(name, "GLES2");
> -
> -    if (!nacl_name)
> -        return NULL;
> -
> -    func = dlsym(self->gl_dl, nacl_name);
> -
> -    if (!func) {
> -        const char *error = dlerror();
> -        if (error) {
> -            wcore_errorf(WAFFLE_ERROR_UNKNOWN,
> -                         "dlsym(libname=\"%s\", symbol=\"%s\") failed: %s",
> -                         NACL_GLES2_LIBRARY, nacl_name, error);
> -        }
> -    }
> -
> -    free(nacl_name);
> -
> -    return func;
> -}
> -
> -static bool
>   nacl_platform_make_current(struct wcore_platform *wc_self,
>                              struct wcore_display *wc_dpy,
>                              struct wcore_window *wc_window,
> @@ -168,8 +92,8 @@ static const struct wcore_platform_vtbl nacl_platform_vtbl = {
>       .destroy = nacl_platform_destroy,
>   
>       .make_current = nacl_platform_make_current,
> -    .dl_can_open = nacl_platform_dl_can_open,
> -    .dl_sym = nacl_platform_dl_sym,
> +    .dl_can_open = nacl_dl_can_open,
> +    .dl_sym = nacl_dl_sym,
>   
>       .display = {
>           .connect = nacl_display_connect,
> diff --git a/src/waffle/nacl/nacl_platform.h b/src/waffle/nacl/nacl_platform.h
> index fa2d364..1a54697 100644
> --- a/src/waffle/nacl/nacl_platform.h
> +++ b/src/waffle/nacl/nacl_platform.h
> @@ -38,7 +38,7 @@
>   struct nacl_platform {
>       struct wcore_platform wcore;
>       struct nacl_container *nacl;
> -    void *gl_dl;
> +    void *dl_gl;
>   };
>   
>   DEFINE_CONTAINER_CAST_FUNC(nacl_platform,



More information about the waffle mailing list