exec.library: Use KrnSchedule() hook
[aros:aros.git] / AROS / rom / exec / forbid.c
1 /*
2     Copyright © 1995-2001, The AROS Development Team. All rights reserved.
3     $Id$
4
5     Desc: Forbid() - Prevent tasks switches from taking place.
6     Lang: english
7 */
8
9 #include <exec/types.h>
10 #include <exec/execbase.h>
11 #include <exec/cpu.h>
12 #include <proto/kernel.h>
13 #include <aros/libcall.h>
14 #include <aros/atomic.h>
15
16 #include "exec_intern.h"
17
18 /*****************************************************************************/
19 #undef  Exec
20 #ifdef UseExecstubs
21 #    define Exec _Exec
22 #endif
23
24 /*  NAME */
25 #include <proto/exec.h>
26
27         AROS_LH0(void, Forbid,
28
29 /*  LOCATION */
30         struct ExecBase *, SysBase, 22, Exec)
31
32 /*  FUNCTION
33         Forbid any further taskswitches until a matching call to Permit().
34         Naturally disabling taskswitches means:
35
36         THIS CALL IS DANGEROUS
37
38         Do not use it without thinking very well about it or better
39         do not use it at all. Most of the time you can live without
40         it by using semaphores or similar.
41
42         Calls to Forbid() nest, i.e. for each call to Forbid() you
43         need one call to Permit().
44
45     INPUTS
46         None.
47
48     RESULT
49         The multitasking state will be disabled AFTER this function
50         returns to the caller.
51
52     NOTES
53         This function preserves all registers.
54
55         To prevent deadlocks calling Wait() in forbidden state breaks
56         the forbid - thus taskswitches may happen again.
57
58     EXAMPLE
59         No you really don't want to use this function.
60
61     BUGS
62         The only architecture that you can rely on the registers being
63         saved is on the Motorola mc68000 family.
64
65     SEE ALSO
66         Permit(), Disable(), Enable(), Wait()
67
68     INTERNALS
69         If you want to preserve all the registers, replace this function
70         in your $(KERNEL) directory. Otherwise this function is
71         satisfactory.
72
73 ******************************************************************************/
74 {
75 #undef Exec
76
77     AROS_LIBFUNC_INIT
78
79 #if AROS_SMP
80     if (KernelBase)
81         KrnScheduling(FALSE);
82 #else
83 #error 1
84 #endif
85     AROS_ATOMIC_INC(SysBase->TDNestCnt);
86
87     AROS_LIBFUNC_EXIT
88 } /* Forbid() */