From 200fbe924466720bd2a8c5eb05b05d67b0a2414c Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Thu, 14 Mar 2013 15:42:19 +0100 Subject: Added support for ENEA OSE This port has support for both non-smp and smp. It contains a new way to do io checking in which erts_poll_wait receives the payload of the polled entity. This has implications for all linked-in drivers. --- erts/emulator/sys/ose/erl_ose_sys_ddll.c | 197 +++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 erts/emulator/sys/ose/erl_ose_sys_ddll.c (limited to 'erts/emulator/sys/ose/erl_ose_sys_ddll.c') diff --git a/erts/emulator/sys/ose/erl_ose_sys_ddll.c b/erts/emulator/sys/ose/erl_ose_sys_ddll.c new file mode 100644 index 0000000000..4121199096 --- /dev/null +++ b/erts/emulator/sys/ose/erl_ose_sys_ddll.c @@ -0,0 +1,197 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2006-2013. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +/* + * Interface functions to the dynamic linker using dl* functions. + * (As far as I know it works on SunOS 4, 5, Linux and FreeBSD. /Seb) + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "sys.h" +#include "erl_vm.h" +#include "global.h" +#ifdef HAVE_DLFCN_H +#include +#endif + + +/* some systems do not have RTLD_NOW defined, and require the "mode" + * argument to dload() always be 1. + */ +#ifndef RTLD_NOW +# define RTLD_NOW 1 +#endif + +#define MAX_NAME_LEN 255 /* XXX should we get the system path size? */ +#define EXT_LEN 3 +#define FILE_EXT ".so" /* extension appended to the filename */ + +static char **errcodes = NULL; +static int num_errcodes = 0; +static int num_errcodes_allocated = 0; + +#define my_strdup(WHAT) my_strdup_in(ERTS_ALC_T_DDLL_ERRCODES, WHAT); + +static char *my_strdup_in(ErtsAlcType_t type, char *what) +{ + char *res = erts_alloc(type, strlen(what) + 1); + strcpy(res, what); + return res; +} + + +static int find_errcode(char *string, ErtsSysDdllError* err) +{ + int i; + + if (err != NULL) { + erts_sys_ddll_free_error(err); /* in case we ignored an earlier error */ + err->str = my_strdup_in(ERTS_ALC_T_DDLL_TMP_BUF, string); + return 0; + } + for(i=0;i ERL_DE_DYNAMIC_ERROR_OFFSET) { + return "Unspecified error"; + } + actual_code = -1*(code - ERL_DE_DYNAMIC_ERROR_OFFSET); +#if defined(HAVE_DLOPEN) + { + char *msg; + + if (actual_code >= num_errcodes) { + msg = "Unknown dlload error"; + } else { + msg = errcodes[actual_code]; + } + return msg; + } +#endif + return "no error"; +} + +void erts_sys_ddll_free_error(ErtsSysDdllError* err) +{ + if (err->str != NULL) { + erts_free(ERTS_ALC_T_DDLL_TMP_BUF, err->str); + } +} -- cgit v1.2.3 From e48c536be1b21711e6e4b16bd8a9b74cf2aa019b Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Thu, 30 Jan 2014 18:47:52 +0100 Subject: ose: Update ddll interface after rebase to 17.0-rc1 Also deleted all the copy-paste stuff --- erts/emulator/sys/ose/erl_ose_sys_ddll.c | 77 ++------------------------------ 1 file changed, 3 insertions(+), 74 deletions(-) (limited to 'erts/emulator/sys/ose/erl_ose_sys_ddll.c') diff --git a/erts/emulator/sys/ose/erl_ose_sys_ddll.c b/erts/emulator/sys/ose/erl_ose_sys_ddll.c index 4121199096..ebd80deeaf 100644 --- a/erts/emulator/sys/ose/erl_ose_sys_ddll.c +++ b/erts/emulator/sys/ose/erl_ose_sys_ddll.c @@ -19,7 +19,7 @@ /* * Interface functions to the dynamic linker using dl* functions. - * (As far as I know it works on SunOS 4, 5, Linux and FreeBSD. /Seb) + * (No support in OSE, we use static linkage instead) */ #ifdef HAVE_CONFIG_H @@ -29,68 +29,15 @@ #include "sys.h" #include "erl_vm.h" #include "global.h" -#ifdef HAVE_DLFCN_H -#include -#endif - - -/* some systems do not have RTLD_NOW defined, and require the "mode" - * argument to dload() always be 1. - */ -#ifndef RTLD_NOW -# define RTLD_NOW 1 -#endif - -#define MAX_NAME_LEN 255 /* XXX should we get the system path size? */ -#define EXT_LEN 3 -#define FILE_EXT ".so" /* extension appended to the filename */ - -static char **errcodes = NULL; -static int num_errcodes = 0; -static int num_errcodes_allocated = 0; - -#define my_strdup(WHAT) my_strdup_in(ERTS_ALC_T_DDLL_ERRCODES, WHAT); - -static char *my_strdup_in(ErtsAlcType_t type, char *what) -{ - char *res = erts_alloc(type, strlen(what) + 1); - strcpy(res, what); - return res; -} -static int find_errcode(char *string, ErtsSysDdllError* err) -{ - int i; - - if (err != NULL) { - erts_sys_ddll_free_error(err); /* in case we ignored an earlier error */ - err->str = my_strdup_in(ERTS_ALC_T_DDLL_TMP_BUF, string); - return 0; - } - for(i=0;i ERL_DE_DYNAMIC_ERROR_OFFSET) { - return "Unspecified error"; - } - actual_code = -1*(code - ERL_DE_DYNAMIC_ERROR_OFFSET); -#if defined(HAVE_DLOPEN) - { - char *msg; - - if (actual_code >= num_errcodes) { - msg = "Unknown dlload error"; - } else { - msg = errcodes[actual_code]; - } - return msg; - } -#endif - return "no error"; + return "Unspecified error"; } void erts_sys_ddll_free_error(ErtsSysDdllError* err) -- cgit v1.2.3