peirce@the780.dec.com.UUCP (02/09/87)
Recently I was trying to use the new time manager calls from LightSpeed C. The thing seemed to work nicely except that a variable stored after the TMTask record kept getting clobbered. Upon further examination, I noticed that there was a field called tmCount in the TMTask record which is declared as an Int. Both the LightSpeed C include file and the time manager chapter of Inside Mac (marked "Final Draft 6/6/86") declare it that way. Now, even though it's marked "reserved" it appears to contain the millisecond countdown set in the PrimeTime() call. Unfortunately, the counting is happening in a long word! (which makes sense since PrimeTime takes a long word of milliseconds) and clobbers anything stored just beyond the record. I changed the declaration to a long and all seems well. I talked to tech support at Think, and the guy didn't have any insight into the problem (in fact he seemed to think that the time manager didn't work - it does with this change!). Has anyone else tried the time manager? or is this really a bug in the documentation (and include file)? I'll include my little test program that redeclares the TMTask type following this text... -- michael --------------------------------------------------------------------------- #include "stdio.h" #include "TimeMgr.h" #include "OSUtil.h" typedef struct newTMTask { struct QElem *qLink; int qType; ProcPtr tmAddr; long tmCount; /*** was an int (16-bit) ***/ } newTMTask; newTMTask Beep1_task; int sync; main() { pascal Beep1(); printf("Begin...\n"); sync = 0; Beep1_task.tmAddr = (ProcPtr) Beep1; printf("tmCnt = %ld\n",Beep1_task.tmCount); InsTime(&Beep1_task); printf("tmCnt = %ld\n",Beep1_task.tmCount); Debugger(); PrimeTime(&Beep1_task,500); printf("tmCnt = %ld\n",Beep1_task.tmCount); printf("tmCnt = %ld\n",Beep1_task.tmCount); printf("tmCnt = %ld\n",Beep1_task.tmCount); printf("tmCnt = %ld\n",Beep1_task.tmCount); printf("tmCnt = %ld\n",Beep1_task.tmCount); printf("tmCnt = %ld\n",Beep1_task.tmCount); printf("tmCnt = %ld\n",Beep1_task.tmCount); printf("tmCnt = %ld\n",Beep1_task.tmCount); while (sync==0) {} printf("Done\n"); } pascal Beep1() { SetUpA5(); SysBeep(1); RmvTime(&Beep1_task); sync = 1; RestoreA5(); } /***** Observed result... Begin... tmCnt = 500 tmCnt = 416 tmCnt = 332 tmCnt = 248 tmCnt = 164 tmCnt = 80 tmCnt = 0 tmCnt = 0 Done *********/