X-Authentication-Warning: delorie.com: mailnull set sender to djgpp-workers-bounces using -f X-Authentication-Warning: new-smtp1.ihug.com.au: Host p378-tnt3.syd.ihug.com.au [203.173.133.124] claimed to be acceleron Message-ID: <000901c1e9ee$597df600$0102a8c0@acceleron> From: "Andrew Cottrell" To: Cc: "Eli Zaretskii" Subject: DJGPP 3.04 & uclock_t & gcc 3.0.4 on Windows-2000 Date: Mon, 22 Apr 2002 21:09:30 +1000 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 Reply-To: djgpp-workers AT delorie DOT com I don't know if this is the correct way of doing this, but in the newsgroup a problem with uclock() around under Win 2K and Eli has responded to the initial query. I thought I would do some testing with the problem to see what the underlying issue is and I found one problem with the assert() function as follows and - 1) In the example below the "assert (start_uclock >= 0);" line sometimes goes off with the following output:- DJGPP_204 D:\dj204\contrib\clock>clock [0] start_uclock = 0 (rv 89353211218 - base 89353211218 [0] end_uclock = 11685 (rv 89353222903 - base 89353211218 [1] start_uclock = 11685 (rv 89353169070 - base 89353211218 Assertion failed at test.c line 115: start_uclock >= 0 Exiting due to signal SIGABRT Raised at eip=000050cd The problem as I see it is that the start_uclock is 11685 and as such the assert should not have failed. The above results are from a command.com running in full screen mode. If I run the program in a window I usually get allot further along to a count of 10 to 12 before I get either the start or end assert failing. 2) The following is an example of the end_uclock assert failing due to rv going backwards. [10] start_uclock = 9847 (rv 89931447164 - base 89931436824 [10] end_uclock = 10862 (rv 89931447686 - base 89931436824 [11] start_uclock = 10862 (rv 89931448197 - base 89931436824 [11] end_uclock = -53635 (rv 89931383189 - base 89931436824 Assertion failed at test.c line 120: end_uclock >= 0 Is it worth looking at the uclock() code a bit more and comparing it to the tiemr code in allegeo to see what the differences are? See point 6) in the notes. Programming notes on the example code:- 1) I have included a modified uclock.c in the same file as the main(). 2) The modifications to the uclock() function were for testing purposes:- a) chaneg the name to acuclock() in order to call the modified code b) Create "long long ac_rv, ac_base;" and update these bfore the return at the end of the uclock() function. 3) I used Rhide 1.5.0 with only the -g compile option 4) The DJGPP 3.04 libc is from 2nd of April. 5) I am using Windows XP. 6) I have used the timer code from Allegro in a comms program and it works on Windows XP. On Mon, 22 Apr 2002 09:39:17 +0300 (IDT), in comp.os.msdos.djgpp you wrote: > >On Mon, 22 Apr 2002, Alex Vinokur wrote: > >> | I can suggest two possible explanations: >> | >> | - the C++ library has a bug when printing long long variables via >> | cout (did you try an equivalent C program?); >> >> >> An equivalent C program usually generates the same result (sometimes it works OK). > >Which leaves us with the other alternative: > >> | - uclock tries to reprogram the system timer chip, but Windows 2000, >> | being of the NT family, doesn't let you do so. > >This doesn't really surprise me: reprogramming the timer on a >multi-programming OS is something that needs a lot of support in the DOS >emulator, since the OS cannot let you reprogram the _real_ timer. And >the DOS emulator of the NT family is known as one that implements only >the bare minimum. Programming the SVGA registers doesn't work for the >same reason. int main() { #define TOTAL_TIMES 1000 int i; uclock_t start_uclock; uclock_t end_uclock; for (i = 0; i < TOTAL_TIMES; i++) { start_uclock = acuclock(); printf ("[%d] start_uclock = %lld (rv %lld - base %lld \n\n", i, end_uclock, ac_rv, ac_base); fflush (NULL); assert (start_uclock >= 0); /* THIS IS THE START ASSERT !!!!! */ end_uclock = acuclock(); printf ("[%d] end_uclock = %lld (rv %lld - base %lld \n\n", i, end_uclock, ac_rv, ac_base); fflush (NULL); assert (end_uclock >= 0); assert (start_uclock < end_uclock); } return 0;