Hello,
We have embedded plt scheme c api in one C++ application.
It works okay under windows, but when run the same application under linux
then the program crashes and the following error message
Is reported
plt-scheme virtual machine has run out of memory; aborting
We have compiled base.c correctly and even linked in the lmzscheme3m
Could you please help us? What are we doing wrong?
I saw in the mail list that there was similar error message when the
lmscheme3m was not linked in but we are linking it .
We have also removed the virtual memory limit in DrScheme.
************attached file****execution order***********
The first time a test string is sent to mzscheme
char * argv3_[] = {"(+ 1 2)"};
scheme_main_setup(1, run, 1, argv3_);
later the users scheme code is sent to mzscheme via
evalString(char *str)
_apply_thunk_catch_exceptions(Scheme_Object *f, Scheme_Object **exn)
init_exn_catching_apply()
and the result is returned from
extract_exn_message(exn);
****************************************************
Best Regards
Mohsen Torabzadeh-Tari
/*
* This file is part of OpenModelica.
*
* Copyright (c) 1998-2008, Linköpings University,
* Department of Computer and Information Science,
* SE-58183 Linköping, Sweden.
*
* All rights reserved.
*
* THIS PROGRAM IS PROVIDED UNDER THE TERMS OF THIS OSMC PUBLIC
* LICENSE (OSMC-PL). ANY USE, REPRODUCTION OR DISTRIBUTION OF
* THIS PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THE OSMC
* PUBLIC LICENSE.
*
* The OpenModelica software and the Open Source Modelica
* Consortium (OSMC) Public License (OSMC-PL) are obtained
* from Linköpings University, either from the above address,
* from the URL: http://www.ida.liu.se/projects/OpenModelica
* and in the OpenModelica distribution.
*
* This program is distributed WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH
* IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS
* OF OSMC-PL.
*
* See the full OSMC Public License conditions for more details.
*
* For more information about the Qt-library visit TrollTech's webpage
* regarding the Qt licence: http://www.trolltech.com/products/qt/licensing.html
*/
//STD Headers
#include <exception>
#include <stdexcept>
//QT Headers
#include <QtCore/QDir>
#include <QtCore/QProcess>
#include <QtCore/QThread>
#include <QtCore/QMutex>
#include <QtGui/QMessageBox>
//IAEX Headers
//#define INITIAL_NAMESPACE_MODULE "scheme/gui/init"
#include "omschemeinteractiveenvironment.h" //Mohsen
#include "base.c" //Mohsen
//#include "mred.h"
//#include "gui.c" //Mohsen for including MrED
//#include <iostream> //Mohsen
//#include <vector> //Mohsen
//#include <string> //Mohsen
//#include <algorithm> //Mohsen
using namespace std;
namespace IAEX
{
class SleeperThread : public QThread
{
public:
static void msleep(unsigned long msecs)
{
QThread::msleep(msecs);
}
};
OmSchemeInteractiveEnvironment* OmSchemeInteractiveEnvironment::selfInstance
= NULL;
OmSchemeInteractiveEnvironment* OmSchemeInteractiveEnvironment::getInstance()
{
if (selfInstance == NULL)
{
selfInstance = new OmSchemeInteractiveEnvironment();
}
return selfInstance;
}
/*!
* \author Mohsen
* \date 2009-12-08
*
*\brief Method for defining the DrScheme environement.
* This method is called in the constructur once with a test scheme
string
* from the scheme_main_setup
*/
int OmSchemeInteractiveEnvironment::run(Scheme_Env *e, int argc, char
*argv[])
{
Scheme_Object *curout = NULL, *v = NULL, *a[2] = {NULL, NULL};
Scheme_Config *config = NULL;
int i;
mz_jmp_buf * volatile save = NULL, fresh; //don't remove the a
varaible, defined in base.c
MZ_GC_DECL_REG(8);
MZ_GC_VAR_IN_REG(0, e);
MZ_GC_VAR_IN_REG(1, curout);
MZ_GC_VAR_IN_REG(2, save);
MZ_GC_VAR_IN_REG(3, config);
MZ_GC_VAR_IN_REG(4, v);
MZ_GC_ARRAY_VAR_IN_REG(5, a, 2);
MZ_GC_REG();
// Declare embedded modules in "base.c":
// base.c is generated from DrScheme
// open command prompt in Visual studio and
// run "/plt/mzc.exe --c-mods base.c ++lib scheme/base"
declare_modules(e);
v = scheme_intern_symbol("scheme/base");
scheme_namespace_require(v);
config = scheme_current_config();
curout = scheme_get_param(config, MZCONFIG_OUTPUT_PORT);
for (i = 0; i < argc; i++) {
save = scheme_current_thread->error_buf;
scheme_current_thread->error_buf = &fresh;
if (scheme_setjmp(scheme_error_buf)) {
scheme_current_thread->error_buf = save;
return -1;
}
else {
v = scheme_eval_string_all(argv[i],
e,1);//scheme_load(argv[i]);
scheme_current_thread->error_buf = save;
}
}
MZ_GC_UNREG();
return 0;
}
/*! \class OmcInteractiveEnvironment
* \author Mohsen
* \date 2009-12-08
*
*\brief Constructor, defines the DrScheme environement.
* scheme_main_setup calls run with the test string "(+ 1 2)" for
setting
* up the Scheme environment
*/
OmSchemeInteractiveEnvironment::OmSchemeInteractiveEnvironment()//:comm_(OmcCommunicator::getInstance()),result_(""),error_("")
{
char * argv3_[] = {"(+ 1 2)"};
scheme_main_setup(1, run, 1, argv3_);
}
OmSchemeInteractiveEnvironment::~OmSchemeInteractiveEnvironment()
{
if (selfInstance)
delete selfInstance;
}
QString OmSchemeInteractiveEnvironment::getResult()
{
return result_;
}
/*!
* \author Mohsen
* \date 2009-12-08
*
*\brief Returning the result string.
*/
void OmSchemeInteractiveEnvironment::setResult(QString str)
{
result_ = str;
}
QString OmSchemeInteractiveEnvironment::getError()
{
return error_;
}
/*!
* \author Mohsen
* \date 2009-12-08
*
*\brief Method for catching the errors.
*/
void OmSchemeInteractiveEnvironment::init_exn_catching_apply()
{
if (!exn_catching_apply)
{
Scheme_Env *env5;
char *e =
"(lambda (thunk) "
"(with-handlers ([void (lambda (exn) (cons #f exn))]) "
"(cons #t (thunk))))";
// Getting the current environment
env5 = scheme_get_env(scheme_current_config());
//registering global variables
scheme_register_extension_global(&exn_catching_apply,
sizeof(Scheme_Object *));
scheme_register_extension_global(&exn_p,
sizeof(Scheme_Object *));
scheme_register_extension_global(&exn_message,
sizeof(Scheme_Object *));
//
exn_catching_apply = scheme_eval_string_all(e, env5,1);
exn_p = scheme_builtin_value("exn?");
//problems with setting exn_p and exn-message ->
// "When you `require' a module, it doesn't create
top-level variables ---
//only import bindings. The scheme_lookup_global()
function looks only
//for top-level variables, ignoring bindings."
//exn_p =
scheme_lookup_global(scheme_intern_symbol("exn?"), env5);
// exn_message =
scheme_lookup_global(scheme_intern_symbol("exn-message"), env5);
exn_message = scheme_builtin_value("exn-message");
//fprintf(stderr, " init exn catching exn_p=%X
exn_message=%X\n", exn_p, exn_message);
}
}
Scheme_Object
*OmSchemeInteractiveEnvironment::_apply_thunk_catch_exceptions(Scheme_Object
*f, Scheme_Object **exn)
{
Scheme_Object *v;
//
init_exn_catching_apply();
//evaluating the string
//v = _scheme_apply_multi(exn_catching_apply, 1, &f);
//changed to multi
v = _scheme_apply(exn_catching_apply, 1, &f); //changed to
multi
/* v is a pair: (cons #t value) or (cons #f exn) */
if (SCHEME_TRUEP(SCHEME_CAR(v)))
return SCHEME_CDR(v);
else
{
*exn = SCHEME_CDR(v);
return NULL;
//Problem with setting exn_p = NULL, bad work around to
//return the SCHEME_CDR(v) isntead of NULL
}
}
Scheme_Object *
OmSchemeInteractiveEnvironment::extract_exn_message(Scheme_Object *v2)
{
init_exn_catching_apply();
if (SCHEME_TRUEP(_scheme_apply(exn_p, 1, &v2)))
//return _scheme_apply_multi(exn_message, 1, &v2);
//changed to multi to evaluate multiple expressions
return _scheme_apply(exn_message, 1, &v2); //changed to multi
to evaluate multiple expressions
else
return NULL;
}
Scheme_Object *OmSchemeInteractiveEnvironment::do_eval(void *s_, int
noargc, Scheme_Object **noargv)
{
return scheme_eval_string_all((char *)s_,
scheme_get_env(scheme_current_config()),1);
}
int OmSchemeInteractiveEnvironment::evalString(char *str)
{
Scheme_Object *v, *v_er, *exn;
v =
_apply_thunk_catch_exceptions(scheme_make_closed_prim(do_eval, str), &exn);
/* Got a value? */
long len,len2;
char * str2;
if (v)
{
str2 = scheme_strdup(scheme_print_to_string(v, &len));
selfInstance->setResult(str2);
return 0;
}
v_er = extract_exn_message(exn);
/* Got an exn? */
if (v_er)
{
//error_ =
QString(scheme_strdup(scheme_print_to_string(SCHEME_CDR(v_er), &len2)));
error_ =
QString(scheme_strdup(scheme_print_to_string(v_er, &len2)));
return 0;
}
}
void OmSchemeInteractiveEnvironment::evalExpression(const QString expr)
{
result_.clear(); // Flushing the old result buffer
error_.clear(); // Flushing the old error buffer
char *argv2_ = strdup(expr.toStdString().c_str());
evalString(argv2_);
return;
}
void OmSchemeInteractiveEnvironment::closeConnection()
{
}
void OmSchemeInteractiveEnvironment::reconnect()
{
}
bool OmSchemeInteractiveEnvironment::startDelegate()
{
return true;
}
bool OmSchemeInteractiveEnvironment::startOMC()
{
return true;
}
QString OmSchemeInteractiveEnvironment::OMCVersion()
{
QString version( "(unknown version)" );
return version;
}
}
_________________________________________________
For list-related administrative tasks:
http://list.cs.brown.edu/mailman/listinfo/plt-dev