load_code: Get rid of win32 specific code in favor SDL_LoadFunction & friends APIs.

Refactor native/hosted implementation seperation while at it
(no wrappers starting with _ anymore).

Change-Id: If68ae89700443bb3be483c1cace3d6739409560a
This commit is contained in:
Thomas Martitz 2012-05-26 22:46:56 +02:00
parent 3f72ba0e3f
commit 3f365fc06b
5 changed files with 90 additions and 134 deletions

View File

@ -7,7 +7,6 @@ backlight.c
buflib.c
core_alloc.c
general.c
load_code.c
powermgmt.c
#if (CONFIG_PLATFORM & PLATFORM_HOSTED)
@ -32,6 +31,7 @@ logf.c
#endif /* ROCKBOX_HAS_LOGF */
kernel.c
#if (CONFIG_PLATFORM & PLATFORM_NATIVE)
load_code.c
#ifdef RB_PROFILE
profile.c
#endif /* RB_PROFILE */

View File

@ -25,10 +25,11 @@
#include "config.h"
extern void *lc_open(const char *filename, unsigned char *buf, size_t buf_size);
#if (CONFIG_PLATFORM & PLATFORM_NATIVE)
#include "system.h"
extern void *lc_open(const char *filename, unsigned char *buf, size_t buf_size);
/* header is always at the beginning of the blob, and handle actually points
* to the start of the blob (the header is there) */
static inline void *lc_open_from_mem(void* addr, size_t blob_size)
@ -44,23 +45,10 @@ static inline void lc_close(void *handle) { (void)handle; }
#elif (CONFIG_PLATFORM & PLATFORM_HOSTED)
/* don't call these directly for loading code
* they're to be wrapped by platform specific functions */
#ifdef WIN32
/* windows' LoadLibrary can only handle ucs2, no utf-8 */
#define _lc_open_char wchar_t
#else
#define _lc_open_char char
#endif
extern void *_lc_open(const _lc_open_char *filename, unsigned char *buf, size_t buf_size);
extern void *_lc_get_header(void *handle);
extern void _lc_close(void *handle);
extern void *lc_open(const char *filename, unsigned char *buf, size_t buf_size);
extern void *lc_open_from_mem(void *addr, size_t blob_size);
extern void *lc_open_from_mem(void* addr, size_t blob_size);
extern void *lc_get_header(void *handle);
extern void lc_close(void *handle);
extern const char* lc_last_error(void);
#endif
/* this struct needs to be the first part of other headers

View File

@ -25,8 +25,6 @@
#include "debug.h"
#include "load_code.h"
#if (CONFIG_PLATFORM & PLATFORM_NATIVE)
/* load binary blob from disk to memory, returning a handle */
void * lc_open(const char *filename, unsigned char *buf, size_t buf_size)
{
@ -97,105 +95,3 @@ error_fd:
error:
return NULL;
}
#elif (CONFIG_PLATFORM & PLATFORM_HOSTED)
/* libdl wrappers */
#ifdef WIN32
/* win32 */
#include <windows.h>
#define dlopen(_x_, _y_) LoadLibraryW(_x_)
#define dlsym(_x_, _y_) (void *)GetProcAddress(_x_, _y_)
#define dlclose(_x_) FreeLibrary(_x_)
static inline char *_dlerror(void)
{
static char err_buf[64];
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), 0,
err_buf, sizeof(err_buf), NULL);
return err_buf;
}
#define dlerror _dlerror
#else
/* unix */
#include <dlfcn.h>
#endif
#include <stdio.h>
#include "rbpaths.h"
#include "general.h"
void * _lc_open(const _lc_open_char *filename, unsigned char *buf, size_t buf_size)
{
(void)buf;
(void)buf_size;
return dlopen(filename, RTLD_NOW);
}
void *lc_open_from_mem(void *addr, size_t blob_size)
{
#ifndef SIMULATOR
(void)addr;
(void)blob_size;
/* we don't support loading code from memory on application builds,
* it doesn't make sense (since it means writing the blob to disk again and
* then falling back to load from disk) and requires the ability to write
* to an executable directory */
return NULL;
#else
/* support it in the sim for the sake of simulating */
int fd, i;
char temp_filename[MAX_PATH];
/* We have to create the dynamic link library file from ram so we
can simulate the codec loading. With voice and crossfade,
multiple codecs may be loaded at the same time, so we need
to find an unused filename */
for (i = 0; i < 10; i++)
{
snprintf(temp_filename, sizeof(temp_filename),
ROCKBOX_DIR "/libtemp_binary_%d.dll", i);
fd = open(temp_filename, O_WRONLY|O_CREAT|O_TRUNC, 0700);
if (fd >= 0)
break; /* Created a file ok */
}
if (fd < 0)
{
DEBUGF("open failed\n");
return NULL;
}
if (write(fd, addr, blob_size) < (ssize_t)blob_size)
{
DEBUGF("Write failed\n");
close(fd);
remove(temp_filename);
return NULL;
}
close(fd);
return lc_open(temp_filename, NULL, 0);
#endif
}
void *_lc_get_header(void *handle)
{
char *ret = dlsym(handle, "__header");
if (ret == NULL)
ret = dlsym(handle, "___header");
return ret;
}
void _lc_close(void *handle)
{
if (handle)
dlclose(handle);
}
const char *lc_last_error(void)
{
return dlerror();
}
#endif

View File

@ -20,24 +20,44 @@
****************************************************************************/
#include <string.h> /* size_t */
#include <dlfcn.h>
#include "debug.h"
#include "load_code.h"
/* unix specific because WIN32 wants UCS instead of UTF-8, so filenames
* need to be converted */
/* plain wrappers , nothing to do */
void *lc_open(const char *filename, unsigned char *buf, size_t buf_size)
{
return _lc_open(filename, buf, buf_size);
(void)buf;
(void)buf_size;
void *handle = dlopen(filename, RTLD_NOW);
if (handle == NULL)
{
DEBUGF("failed to load %s\n", filename);
DEBUGF("lc_open(%s): %s\n", filename, dlerror());
}
return handle;
}
void *lc_get_header(void *handle)
{
return _lc_get_header(handle);
char *ret = dlsym(handle, "__header");
if (ret == NULL)
ret = dlsym(handle, "___header");
return ret;
}
void lc_close(void *handle)
{
_lc_close(handle);
dlclose(handle);
}
void *lc_open_from_mem(void *addr, size_t blob_size)
{
(void)addr;
(void)blob_size;
/* we don't support loading code from memory on application builds,
* it doesn't make sense (since it means writing the blob to disk again and
* then falling back to load from disk) and requires the ability to write
* to an executable directory */
return NULL;
}

View File

@ -584,27 +584,79 @@ int sim_fsync(int fd)
#ifndef __PCTOOL__
#include <SDL_loadso.h>
void *lc_open(const char *filename, unsigned char *buf, size_t buf_size)
{
const char *sim_path = get_sim_pathname(filename);
void *handle = _lc_open(UTF8_TO_OS(sim_path), buf, buf_size);
(void)buf;
(void)buf_size;
void *handle = SDL_LoadObject(get_sim_pathname(filename));
if (handle == NULL)
{
DEBUGF("failed to load %s\n", filename);
DEBUGF("lc_open(%s): %s\n", filename, lc_last_error());
DEBUGF("lc_open(%s): %s\n", filename, SDL_GetError());
}
return handle;
}
void *lc_get_header(void *handle)
{
return _lc_get_header(handle);
char *ret = SDL_LoadFunction(handle, "__header");
if (ret == NULL)
ret = SDL_LoadFunction(handle, "___header");
return ret;
}
void lc_close(void *handle)
{
_lc_close(handle);
SDL_UnloadObject(handle);
}
void *lc_open_from_mem(void *addr, size_t blob_size)
{
#ifndef SIMULATOR
(void)addr;
(void)blob_size;
/* we don't support loading code from memory on application builds,
* it doesn't make sense (since it means writing the blob to disk again and
* then falling back to load from disk) and requires the ability to write
* to an executable directory */
return NULL;
#else
/* support it in the sim for the sake of simulating */
int fd, i;
char temp_filename[MAX_PATH];
/* We have to create the dynamic link library file from ram so we
can simulate the codec loading. With voice and crossfade,
multiple codecs may be loaded at the same time, so we need
to find an unused filename */
for (i = 0; i < 10; i++)
{
snprintf(temp_filename, sizeof(temp_filename),
ROCKBOX_DIR "/libtemp_binary_%d.dll", i);
fd = open(temp_filename, O_WRONLY|O_CREAT|O_TRUNC, 0700);
if (fd >= 0)
break; /* Created a file ok */
}
if (fd < 0)
{
DEBUGF("open failed\n");
return NULL;
}
if (write(fd, addr, blob_size) < (ssize_t)blob_size)
{
DEBUGF("Write failed\n");
close(fd);
remove(temp_filename);
return NULL;
}
close(fd);
return lc_open(temp_filename, NULL, 0);
#endif
}
#endif /* __PCTOOL__ */