Sender: rich AT phekda DOT freeserve DOT co DOT uk Message-ID: <3BDDD2F5.4D609543@phekda.freeserve.co.uk> Date: Mon, 29 Oct 2001 22:06:45 +0000 From: Richard Dawe X-Mailer: Mozilla 4.77 [en] (X11; U; Linux 2.2.19 i586) X-Accept-Language: de,fr MIME-Version: 1.0 To: DJGPP workers Subject: Patch for develop.txi: BSS and restarted programs Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Reply-To: djgpp-workers AT delorie DOT com Hello. Below is a patch for develop.txi in the knowledge base, which describes what to do about BSS and restarting programs (aka Emacs ;) ) restarting. I've been wondering about this for a while - my /dev/{zero,full} patches need updating to cope with restarting programs. BTW what does BSS stand? OK to commit? Thanks, bye, Rich =] -- Richard Dawe http://www.phekda.freeserve.co.uk/richdawe/ Index: src/docs/kb/develop.txi =================================================================== RCS file: /cvs/djgpp/djgpp/src/docs/kb/develop.txi,v retrieving revision 1.5 diff -p -c -3 -r1.5 develop.txi *** src/docs/kb/develop.txi 2001/03/31 13:44:50 1.5 --- src/docs/kb/develop.txi 2001/10/29 22:03:05 *************** functions, it should include @file{libc/ *** 77,82 **** --- 77,127 ---- @sc{gs} register instead of @sc{fs}, to avoid clobbering @sc{fs} which might be used by the application. + @subsection BSS and restarted programs + @cindex BSS and restarted programs + + Uninitialised static and global data is placed in the section @dfn{bss}. + The BSS is zeroed by the start-up code. It would seem that one can rely + on uninitialised static and global variables being initialised to zero. + Unfortunately it is possible that the start-up code is not called. + This happens where programs are restarted --- Emacs is one example. + + Fortunately there is a way that library code can detect a restart. + The variable @code{__bss_count} contains a counter of the number of times + that the program has been started. A routine using BSS can store + @code{__bss_count} and then check whether it needs to initialise its data + by comparing @code{__bss_count} with its stored value. Here is an example: + + @example + #include + #include + + extern int do_something_interesting (const int n); + + static int my_bss_count = -1; + static int my_array[20]; + + int + myfunc (const int n) + @{ + if (my_bss_count != __bss_count) + @{ + my_bss_count = __bss_count; + memset(my_array, 0, sizeof(my_array)); + @} + + if (n >= 20) + return 0; + + if (!my_array[n]) + my_array[n] = do_something_interesting(n); + + return(my_array[n]); + @} + @end example + + For more details see @file{src/libc/crt0/crt1.c} in the DJGPP libc sources. + @section Texinfo documentation @subsection Formatting