[waffle] [PATCH v2 8/8] nacl: add implementation for waffle_dl_sym

Tapani Pälli tapani.palli at intel.com
Thu Feb 12 05:16:16 PST 2015



On 02/12/2015 01:02 PM, Emil Velikov wrote:
> On 9 February 2015 at 13:24, Tapani Pälli <tapani.palli at intel.com> wrote:
>> v2: use wcore_calloc, code cleanup (Emil Velikov)
>>      open dll only once in can_open (Chad Versace)
>>
>> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
>> ---
>>   src/waffle/nacl/nacl_platform.c | 69 +++++++++++++++++++++++++++++++++++++++--
>>   src/waffle/nacl/nacl_platform.h |  1 +
>>   2 files changed, 68 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/waffle/nacl/nacl_platform.c b/src/waffle/nacl/nacl_platform.c
>> index c4fefe5..22169da 100644
>> --- a/src/waffle/nacl/nacl_platform.c
>> +++ b/src/waffle/nacl/nacl_platform.c
>> @@ -43,6 +43,11 @@ 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());
>> +
>>       free(self);
>>       return ok;
>>   }
>> @@ -51,7 +56,41 @@ static bool
>>   nacl_platform_dl_can_open(struct wcore_platform *wc_self,
>>                             int32_t waffle_dl)
>>   {
>> -    return false;
>> +    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*
>> @@ -59,7 +98,33 @@ nacl_platform_dl_sym(struct wcore_platform *wc_self,
>>                        int32_t waffle_dl,
>>                        const char *name)
>>   {
>> -    return NULL;
>> +    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))
> I'm sorry boring this again but - doing this will not set the correct
> error on WAFFLE_DL_OPENGL_ES3.

Thanks for pointing this out. I've been now busy with some bugs but I'll 
promise to fix this.


>> +            return false;
> return NULL;
>
> Cheers,
> Emil
>


// Tapani


More information about the waffle mailing list