don't zero io_Actual on error, this field is automaticaly incremented as soon as...
[AROS.git] / compiler / alib / timedelay.c
blobbbb7bd007bc60f68fb11655dcb619593fbf1c583
1 /*
2 Copyright � 1995-2007, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: TimeDelay() - wait a specified time.
6 Lang: english
7 */
10 #include <exec/types.h>
11 #include <aros/asmcall.h>
12 #include <devices/timer.h>
13 #include <exec/tasks.h>
14 #include <proto/exec.h>
16 /*****************************************************************************
18 NAME */
19 LONG TimeDelay(
21 /* SYNOPSIS */
22 LONG Unit,
23 ULONG Seconds,
24 ULONG MicroSeconds)
26 /* FUNCTION
27 TimeDelay() waits for the specified period of time before returning
28 to the caller.
30 INPUTS
31 Unit - The timer.device unit to use for this command.
32 Seconds - The number of seconds to wait.
33 MicroSeconds - The number of microseconds to wait.
35 RESULT
36 Zero if everything went ok, non-zero if there was a problem.
38 NOTES
39 If this function fails, the most likely reasons are:
40 - invalid timer.device unit numbers
42 This function uses the SIGF_SINGLE signal, strange things can
43 happen if you are waiting on this signal when you call this
44 function. Basically: Don't use it and call this function.
46 EXAMPLE
48 BUGS
50 SEE ALSO
51 timer.device/TR_ADDREQUEST
53 INTERNALS
55 HISTORY
57 ******************************************************************************/
59 struct timerequest tr;
60 struct MsgPort *mp;
61 UBYTE error = 0;
63 /* Create a message port */
64 if ((mp = CreateMsgPort()) != NULL)
66 FreeSignal(mp->mp_SigBit);
67 mp->mp_SigBit = SIGB_SINGLE;
69 tr.tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE;
70 tr.tr_node.io_Message.mn_Node.ln_Pri = 0;
71 tr.tr_node.io_Message.mn_Node.ln_Name = NULL;
72 tr.tr_node.io_Message.mn_ReplyPort = mp;
73 tr.tr_node.io_Message.mn_Length = sizeof(struct timerequest);
75 SetSignal(0, SIGF_SINGLE);
77 if(OpenDevice("timer.device", Unit, (struct IORequest *)&tr, 0) == 0)
79 tr.tr_node.io_Command = TR_ADDREQUEST;
80 tr.tr_node.io_Flags = 0;
81 tr.tr_time.tv_secs = Seconds;
82 tr.tr_time.tv_micro = MicroSeconds;
84 DoIO((struct IORequest *)&tr);
86 CloseDevice((struct IORequest *)&tr);
87 error = 1;
89 mp->mp_SigBit = -1;
90 DeleteMsgPort(mp);
92 return error;
94 } /* TimeDelay() */