Looks like I posted too soon.
I can run SOME Cygwin/gcc programs up to 2.83GB with the changes I mentioned in my first post
(yesterday), but not ALL programs (and not anything useful...). The problem seems to be with
Cygwin's implementation of disk access functions like fscanf() and fgets(). The following code as
written here and compiled under gcc/Cygwin (with the gcc line commented out at the top) WILL run up
to 2.83GB image size. However, if the fscanf() line is uncommented the resulting program dies just
above a 2GB image size with the error "*** fatal error - cmalloc would have returned
NULL". The file tmp contains "hello.\n". If the program is compiled with fscanf()
uncommented using cl (Visual Studio C++ compiler - the 2nd compile line commented out below) the
program will run up to 2.83GB before it runs out of memory. fgets() has the same effect as
fscanf(). I'm using Task Manager Mem Usage column to watch the memory grow.
I also tested fprintf(stdout,...) strlen() sscanf() calloc() sprintf() fopen()
fabs() fclose() strtok() strcmp() strdup() strspn() and free() all of which
work fine up to 2.83GB.
My conclusion is that there's something in Cygwin's implementation of disk
access functions (fscanf(), fgets(), ...?) that stops working when the process
image size goes over 2GB. Since the /3GB switch enables user pointers above
7FFFFFFF my guess would be something like assumptions made about the most
significant pointer bit.
/rob
#include <stdlib.h>
#include <stdio.h>
// to compile : gcc -g -Wall -Wpadded -Wl,--large-address-aware -o
memory_eater2.x memory_eater2.c
// to compile : cl memory_eater2.c winmm.lib /link /largeaddressaware
int main (int argc, char *argv[])
{
FILE *f;
char *buf;
long c = 0;
while (1 != 2) {
if ((buf = (char *) calloc(24,sizeof(char))) == NULL) {
fprintf(stderr,"Problem in %s line %d allocating
memory\n",__FILE__,__LINE__);
return(1);
}
c++;
if ((c % 5000) == 0) {
if ((f = fopen("./tmp","r")) == NULL) {
fprintf(stderr,"Problem in %s line %d opening input
file\n",__FILE__,__LINE__);
return(1);
}
// fscanf(f,"%s",buf);
fclose(f);
}
}
return(0);
}
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple