Date: 16 Mar 93 13:27:00 +0003 (GMT+3:00) From: "Fine-62701 219828" Subject: RE: djgpp 1.10 To: "djgpp" I had had some trouble in my package trying SYSTEM function. Having applied the next patch received from Chris ("kuku AT acds DOT physik DOT rwth-aachen DOT de") I resolved my problem. So I did not hear anything about paging bugs in this list yet I'd like to know is it included in next go32 release? ================================================================= Dr. Valery Fine /LCTA Telex 911621 dubna su Fax (+7 095) 975 23 81 Joint Inst. for Nuclear Res. Email: fine AT main1 DOT jinr DOT dubna DOT su Head Post Office, PO Box 79 fine AT vxcern DOT cern DOT ch Moscow, 101000 Russia ================= Appendix ========================= Chris has written: > P.S. > paging.c follows: > > > I find a trouble in go32. > I show you a sample program for the trouble. Please compile > it with djgpp, and run with go32 (not debug32). > > /* this is file go32chk.c */ > #include > char a[24576]={1}; > void main() > { > printf ("1: a[12288]= %d\n",a[12288]); > a[12288]=-1; > printf ("2: a[12288]= %d\n",a[12288]); > > system("echo child process"); > > printf (" a[8192]= %d\n",a[8192]); > printf ("3: a[12288]= %d\n",a[12288]); > } > /* end of file */ > > > gcc go32chk.c > > go32 a.out > > Of cource the expected result is: > > 1: a[12288]= 0 > 2: a[12288]= -1 > child process > a[8192]= 0 > 3: a[12288]= -1 > > but some results may be: > > 1: a[12288]= 0 > 2: a[12288]= -1 > child process > a[8192]= 0 > 3: a[12288]= 0 > > I think that this is due to a bug in the paging mechanism. > This bug is rare but I feel it is very dangerous... > > Patch for go32 1.09 to fix this trouble follows. > Please try and test it. > > *** paging.c0 Sun Nov 1 07:54:38 1992 > --- paging.c Fri Jan 8 09:27:46 1993 > *************** > *** 110,116 **** > word32 far *vcpi_pt = 0; > extern word32 graphics_pt_lin; > char paging_buffer[4096*MAX_PAGING_NUM]; > - static int paged_out_something = 0; > > word32 screen_primary, screen_secondary; > > --- 110,115 ---- > *************** > *** 567,573 **** > return 0; > } > count = MAX_PAGING_NUM; > ! if ((count > mem_avail/4) || (paged_out_something)) > count = 1; > if (pti + count > 1024) > count = 1024 - pti; > --- 566,572 ---- > return 0; > } > count = MAX_PAGING_NUM; > ! if (count > mem_avail/4) > count = 1; > if (pti + count > 1024) > count = 1024 - pti; > *************** > *** 582,587 **** > --- 581,588 ---- > { > if (pt[pti] & PT_P) > break; > + if (eaddr != -1 && (pt[pti] & PT_I) != 0) > + break; /* EastWind 1993 */ > dblock = pt[pti] >> 12; > pn = valloc(VA_1M); > pt[pti] &= 0xfffL & ~(word32)(PT_A | PT_D); > *************** > *** 629,635 **** > } > pt[pti] |= PT_I; > } > - if (paged_out_something) > break; > } > if (eaddr != -1) > --- 630,635 ---- > *************** > *** 680,687 **** > #if TOPLINEINFO > old_status = update_status('>' | 0x0a00, 79); > #endif > - if (!fInPageOutEverything) > - paged_out_something = 1; > start_pdi = last_po_pdi; > start_pti = last_po_pti; > if (where == VA_640) > --- 680,685 ---- > > The variable "paged_out_something" seemed to be expected to > fix the paging problem, but it was imperfect. I took away > it. > > At last, I want to hear DJ's view. > Do you think multi-page-loading mechanism is effective? > (Should MAX_PAGING_NUM be 4 ?) > > Thank you very much. > > Faculty of Eng., Mi'e Univ., Tsu, Japan. > na70103 AT mips DOT cc DOT mie-u DOT ac DOT jp Makoto Kobayashi > $