mpvenkatesh@lycos.com
2003-May-05 01:07 UTC
[Rd] R-1.7.0: Rproxy.dll loadlibrary/freelibrary error (PR#2914)
Full_Name: Venkatesh Mysore
Version: R-1.7.0
OS: WindowsXP
Submission from: (NULL) (216.165.110.10)
While accessing Rproxy.dll repeatedly (using the code from the (D)COM example in
the R website) causes a failure in the 24th iteration. R-1.6.2 does NOT give
this error. This seems to be a memory management error, that might be linked to
the huge leakage difference between R-1.7.0 and R-1.6.2 (leakage observed using
Windows Task Manager).
Here is a C program that can be used to reproduce the error:
(the files SC-Proxy.h, Defn.h, Rinternals.h etc.. are to be included in the path
- see StatConnector.cpp in the (D)COM server example)
#include "windows.h"
#include "stdio.h"
#include "SC_Proxy.h"
#define RDLL "Rproxy.dll"
struct _SC_Proxy_Object* m_ProxyObject;
HMODULE m_ProxyModule;
#define SERVER_MAJOR_VERSION "1"
#define SERVER_MINOR_VERSION "2"
#define SCN_IERR_INTERFACENOTFOUND 0x81000000
#define SCN_IERR_LIBRARYNOTFOUND 0x81000001
#define SCN_IERR_INVALIDLIBRARY 0x81000002
#define SCN_IERR_INITIALIZATIONFAILED 0x81000003
#define SCN_IERR_INVALIDCONNECTORNAME 0x81000004
#define SCN_ERR_INITIALIZED 0x81000005
#define SCN_ERR_NOTINITIALIZED 0x81000006
#define TRACEBUFSIZE 1024
// 00-02-18 | baier | support arguments for connector initialization
// 01-04-04 | baier | enhancements by BDR: set RHOME from registry
// 03-04-07 | baier | check registry key on failure even if R_HOME is set,
// check PATH if everything else fails. trace failures!
int loadDll()
{
static char lTraceBuffer[TRACEBUFSIZE];
// get entry-point
if (getenv ("R_HOME"))
{ // BDR
OutputDebugString("from env:");
char DLLlocation[MAX_PATH];
strcpy(DLLlocation, getenv("R_HOME"));
strcat(DLLlocation, "\\bin\\");
strcat(DLLlocation, RDLL);
OutputDebugString(DLLlocation);
m_ProxyModule = LoadLibraryEx (DLLlocation, NULL,
LOAD_WITH_ALTERED_SEARCH_PATH);
// trace failure!
if (m_ProxyModule == 0) {
sprintf(lTraceBuffer,"R_HOME set to \"%s\", failed to load
\"%s\"\n",
getenv("R_HOME"),DLLlocation);
OutputDebugString(lTraceBuffer);
}
}
if (m_ProxyModule == 0)
{
// look in the registry
OutputDebugString("from reg:");
char DLLlocation[MAX_PATH];
LONG rc;
HKEY hkey;
DWORD keytype = REG_SZ;
DWORD cbData = sizeof (DLLlocation);
rc = RegOpenKeyEx (HKEY_LOCAL_MACHINE, "Software\\R-core\\R", 0,
KEY_READ, &hkey);
if (rc == ERROR_SUCCESS)
{
rc = RegQueryValueEx (hkey, "InstallPath", 0, &keytype,
(LPBYTE)DLLlocation, &cbData);
RegCloseKey (hkey);
}
if (rc == ERROR_SUCCESS)
{
// set R_HOME
char *buf;
buf (char *) malloc ((strlen (DLLlocation) + 8) * sizeof (char));
strcpy (buf, "R_HOME=");
strcat (buf, DLLlocation);
putenv (buf);
//SetEnvironmentVariable ("R_HOME",DLLlocation);
strcat (DLLlocation, "\\bin\\");
strcat (DLLlocation, RDLL);
OutputDebugString(DLLlocation);
m_ProxyModule = LoadLibraryEx (DLLlocation, NULL,
LOAD_WITH_ALTERED_SEARCH_PATH);
if (m_ProxyModule == 0) {
sprintf(lTraceBuffer,"Registry information said to load \"%s\",
failed!\n",
DLLlocation);
OutputDebugString(lTraceBuffer);
}
}
} //module==0
//m_ProxyModule = LoadLibraryEx ("C:\\R\\rw1070\\bin\\Rproxy.dll",
NULL,
// LOAD_WITH_ALTERED_SEARCH_PATH);
SC_PROXY_GET_OBJECT lFunc;
lFunc = (SC_PROXY_GET_OBJECT) GetProcAddress (m_ProxyModule,
SC_PROXY_GET_OBJECT_FUN);
if (lFunc == 0)
{
return -1;
}
// get proxy object
ULONG lRc = lFunc (&m_ProxyObject,SC_PROXY_INTERFACE_VERSION);
if ((lRc != SC_PROXY_OK) || (m_ProxyObject == 0))
{
FreeLibrary (m_ProxyModule);
m_ProxyModule = 0;
return -2;
}
char* lParams = 0;
lParams = strdup ("");
OutputDebugString("vtbl->init getting called:");
// init R
lRc = m_ProxyObject->vtbl->init (m_ProxyObject,lParams);
OutputDebugString("done init.");
free (lParams);
if (lRc != SC_PROXY_OK)
{
m_ProxyObject->vtbl->release (m_ProxyObject);
m_ProxyObject = 0;
FreeLibrary (m_ProxyModule);
m_ProxyModule = 0;
return -3;
}
return 1;
}
int unloadDll()
{
m_ProxyObject->vtbl->release (m_ProxyObject);
m_ProxyObject = 0;
DWORD err;
int b = FreeLibrary (m_ProxyModule);
if (b==0) {
err = GetLastError();
char ss[100];
sprintf(ss,"\n\nErr = %d\n\n", err);
OutputDebugString(ss);
return -1;
} else OutputDebugString("no error unloading Rproxy dll.\n\n");
m_ProxyModule = 0;
return 1;
}
int main() {
char ss[100];
int i,x,a;
for (i=1; i<=100; i++) {
sprintf(ss,"Iteration: %d", i);
OutputDebugString(ss);
x=loadDll();
if (x<=0) OutputDebugString("LoadLibraryEx ERROR.");
else OutputDebugString("LoadLibraryEx succeeded.");
a = unloadDll();
if (a<=0) OutputDebugString("FreeLibrary ERROR.");
else OutputDebugString("FreeLibrary succeeded.");
}
}
-----------------------------------------
-Venkatesh Mysore
Bioinformatics Group,
New York University
Duncan Murdoch
2003-May-06 15:24 UTC
[Rd] R-1.7.0: Rproxy.dll loadlibrary/freelibrary error (PR#2914)
Venkatesh: I was hoping someone else would pick up on this one. I don't know the rproxy code at all, so I can't tell if the error you are seeing is some new error in R or a mistake on your part. I've cc'd this to Thomas Baier; Thomas, can you comment on this? Venkatesh, you do mention a "huge leakage difference". Could you expand on that, and maybe give a loop in plain R code that causes R to grow without bounds? Duncan Murdoch On Mon, 5 May 2003 01:07:30 +0200 (MET DST), you wrote in message <200305042307.h44N7U2b006301@pubhealth.ku.dk>:>Full_Name: Venkatesh Mysore >Version: R-1.7.0 >OS: WindowsXP >Submission from: (NULL) (216.165.110.10) > > >While accessing Rproxy.dll repeatedly (using the code from the (D)COM example in >the R website) causes a failure in the 24th iteration. R-1.6.2 does NOT give >this error. This seems to be a memory management error, that might be linked to >the huge leakage difference between R-1.7.0 and R-1.6.2 (leakage observed using >Windows Task Manager). > >Here is a C program that can be used to reproduce the error: >(the files SC-Proxy.h, Defn.h, Rinternals.h etc.. are to be included in the path >- see StatConnector.cpp in the (D)COM server example) > > >#include "windows.h" >#include "stdio.h" >#include "SC_Proxy.h" >#define RDLL "Rproxy.dll" >struct _SC_Proxy_Object* m_ProxyObject; >HMODULE m_ProxyModule; > > >#define SERVER_MAJOR_VERSION "1" >#define SERVER_MINOR_VERSION "2" > >#define SCN_IERR_INTERFACENOTFOUND 0x81000000 >#define SCN_IERR_LIBRARYNOTFOUND 0x81000001 >#define SCN_IERR_INVALIDLIBRARY 0x81000002 >#define SCN_IERR_INITIALIZATIONFAILED 0x81000003 >#define SCN_IERR_INVALIDCONNECTORNAME 0x81000004 >#define SCN_ERR_INITIALIZED 0x81000005 >#define SCN_ERR_NOTINITIALIZED 0x81000006 > >#define TRACEBUFSIZE 1024 >// 00-02-18 | baier | support arguments for connector initialization >// 01-04-04 | baier | enhancements by BDR: set RHOME from registry >// 03-04-07 | baier | check registry key on failure even if R_HOME is set, >// check PATH if everything else fails. trace failures! >int loadDll() >{ > static char lTraceBuffer[TRACEBUFSIZE]; > // get entry-point > if (getenv ("R_HOME")) > { // BDR > OutputDebugString("from env:"); > char DLLlocation[MAX_PATH]; > strcpy(DLLlocation, getenv("R_HOME")); > strcat(DLLlocation, "\\bin\\"); > strcat(DLLlocation, RDLL); > OutputDebugString(DLLlocation); > m_ProxyModule = LoadLibraryEx (DLLlocation, NULL, > LOAD_WITH_ALTERED_SEARCH_PATH); > // trace failure! > if (m_ProxyModule == 0) { > sprintf(lTraceBuffer,"R_HOME set to \"%s\", failed to load \"%s\"\n", > getenv("R_HOME"),DLLlocation); > OutputDebugString(lTraceBuffer); > } > } > > if (m_ProxyModule == 0) > { > // look in the registry > OutputDebugString("from reg:"); > char DLLlocation[MAX_PATH]; > LONG rc; > HKEY hkey; > DWORD keytype = REG_SZ; > DWORD cbData = sizeof (DLLlocation); > rc = RegOpenKeyEx (HKEY_LOCAL_MACHINE, "Software\\R-core\\R", 0, > KEY_READ, &hkey); > if (rc == ERROR_SUCCESS) > { > rc = RegQueryValueEx (hkey, "InstallPath", 0, &keytype, > (LPBYTE)DLLlocation, &cbData); > RegCloseKey (hkey); > } > > if (rc == ERROR_SUCCESS) > { > // set R_HOME > char *buf; > buf > (char *) malloc ((strlen (DLLlocation) + 8) * sizeof (char)); > strcpy (buf, "R_HOME="); > strcat (buf, DLLlocation); > putenv (buf); > //SetEnvironmentVariable ("R_HOME",DLLlocation); > strcat (DLLlocation, "\\bin\\"); > strcat (DLLlocation, RDLL); > OutputDebugString(DLLlocation); > m_ProxyModule = LoadLibraryEx (DLLlocation, NULL, > LOAD_WITH_ALTERED_SEARCH_PATH); > if (m_ProxyModule == 0) { > sprintf(lTraceBuffer,"Registry information said to load \"%s\", failed!\n", > DLLlocation); > OutputDebugString(lTraceBuffer); > } > } > } //module==0 > > //m_ProxyModule = LoadLibraryEx ("C:\\R\\rw1070\\bin\\Rproxy.dll", NULL, > // LOAD_WITH_ALTERED_SEARCH_PATH); > > > > SC_PROXY_GET_OBJECT lFunc; > > lFunc = (SC_PROXY_GET_OBJECT) GetProcAddress (m_ProxyModule, > SC_PROXY_GET_OBJECT_FUN); > > > if (lFunc == 0) > { > return -1; > } > > // get proxy object > ULONG lRc = lFunc (&m_ProxyObject,SC_PROXY_INTERFACE_VERSION); > > > if ((lRc != SC_PROXY_OK) || (m_ProxyObject == 0)) > { > FreeLibrary (m_ProxyModule); > m_ProxyModule = 0; > > return -2; > } > > char* lParams = 0; > > lParams = strdup (""); > OutputDebugString("vtbl->init getting called:"); > // init R > lRc = m_ProxyObject->vtbl->init (m_ProxyObject,lParams); > OutputDebugString("done init."); > free (lParams); > > if (lRc != SC_PROXY_OK) > { > m_ProxyObject->vtbl->release (m_ProxyObject); > m_ProxyObject = 0; > FreeLibrary (m_ProxyModule); > m_ProxyModule = 0; > > return -3; > } > return 1; >} > >int unloadDll() >{ > > m_ProxyObject->vtbl->release (m_ProxyObject); > m_ProxyObject = 0; > > DWORD err; > int b = FreeLibrary (m_ProxyModule); > if (b==0) { > err = GetLastError(); > char ss[100]; > sprintf(ss,"\n\nErr = %d\n\n", err); > OutputDebugString(ss); > return -1; > } else OutputDebugString("no error unloading Rproxy dll.\n\n"); > > m_ProxyModule = 0; > > return 1; >} > > >int main() { > char ss[100]; > int i,x,a; > for (i=1; i<=100; i++) { > sprintf(ss,"Iteration: %d", i); > OutputDebugString(ss); > x=loadDll(); > if (x<=0) OutputDebugString("LoadLibraryEx ERROR."); > else OutputDebugString("LoadLibraryEx succeeded."); > a = unloadDll(); > if (a<=0) OutputDebugString("FreeLibrary ERROR."); > else OutputDebugString("FreeLibrary succeeded."); > } >} > >----------------------------------------- > >-Venkatesh Mysore >Bioinformatics Group, >New York University > >______________________________________________ >R-devel@stat.math.ethz.ch mailing list >https://www.stat.math.ethz.ch/mailman/listinfo/r-devel