Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
SleepQ.c
/* This snippet demonstrates how to create a sleep queue entry under Think C */ |
#include "Power.h" |
#include "SetUpa4.h" |
pascal long MySleepQueueEntry(void); |
SleepQRec gMySleepQStruct; |
/* |
Here's where we install our sleep queue entry. This is all |
by the book, as documented in Inside Mac volume VI. |
*/ |
void InstallOurSleepQueueEntry() |
{ |
RememberA4(); |
/* install our test routine in the sleep process queue */ |
gMySleepQStruct.sleepQLink = 0; |
gMySleepQStruct.sleepQType = slpQType; |
gMySleepQStruct.sleepQProc = (ProcPtr) &MySleepQueueEntry; |
gMySleepQStruct.sleepQFlags = 0; |
SleepQInstall(&gMySleepQStruct); |
} |
/* This routine can be called at any of four ways as indicated by D0. |
When it's called, register A0 contains a pointer to our sleep queue record, |
and register D0 contains a "what's happening" value: |
1 = sleep request (i.e. "Can I sleep?") |
2 = sleep demand (i.e. "You must sleep.") |
3 = wakeup demand (i.e. "You must wake up.") |
4 = sleep-request revocation (i.e. "I changed my mind about putting you to sleep.") |
Since Think C depends upon C calling conventions, you need special in-line |
assembly to handle this routine. |
*/ |
pascal long MySleepQueueEntry(void) |
{ |
long whatToDo; /* passed to us in D0 */ |
SleepQRec *sqPtr; /* passed to us in A0 */ |
long returnValue; |
/* Important: These assembly instructions must be the first executable code |
** in this routine, or you have the potential of changing D0 and/or A0 before |
** you get a chance to save them. Don't put any code before this asm statement! |
*/ |
asm { |
MOVE.L D0, whatToDo |
MOVE.L A0, sqPtr |
} |
SetUpA4(); |
returnValue = 0; /* 0 = okay whatever the system wants to do */ |
/* At this point, you'd do whatever you want to do at sleep time. |
*/ |
switch (whatToDo) { |
case sleepRequest: |
DebugStr("\pIn sleepRequest"); |
break; |
case sleepDemand: |
DebugStr("\pIn sleepDemand"); |
break; |
case sleepWakeUp: |
DebugStr("\pIn sleepWakeUp"); |
break; |
case sleepRevoke: |
DebugStr("\pIn sleepRevoke"); |
break; |
} |
RestoreA4(); |
/* Important: this asm statement must be the last executable code in this |
** routine, or you won't return the proper value in D0. |
*/ |
asm { |
MOVE.L returnValue, D0 |
} |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14