exec.library: Use KrnSchedule() hook
[aros:aros.git] / AROS / rom / exec / permit.c
1 /*
2     Copyright © 1995-2010, The AROS Development Team. All rights reserved.
3     $Id$
4
5     Desc: Permit() - Allow tasks switches to occur.
6     Lang: english
7 */
8
9 #include <exec/types.h>
10 #include <exec/execbase.h>
11 #include <aros/libcall.h>
12 #include <aros/atomic.h>
13 #include <aros/debug.h>
14 #include <proto/exec.h>
15 #include <proto/kernel.h>
16
17 #include "exec_intern.h"
18
19 #undef Exec
20 #ifdef UseExecstubs
21 #    define Exec _Exec
22 #endif
23
24
25 /*****************************************************************************
26
27     NAME */
28
29         AROS_LH0(void, Permit,
30
31 /*  LOCATION */
32         struct ExecBase *, SysBase, 23, Exec)
33
34 /*  FUNCTION
35         This function will reactivate the task dispatcher after a call
36         to Forbid(). Note that calls to Forbid() nest, and for every
37         call to Forbid() you need a matching call to Permit().
38
39     INPUTS
40         None.
41
42     RESULT
43         Multitasking will be re-enabled.
44
45     NOTES
46         This function preserves all registers.
47
48         To prevent deadlocks calling Wait() in forbidden state breaks
49         the forbid - thus taskswitches may happen again.
50
51     EXAMPLE
52         No you really don't want to use this function.
53
54 BUGS
55     The only architecture that you can rely on the registers being
56     saved is on the Motorola mc68000 family.
57
58 SEE ALSO
59     Forbid(), Disable(), Enable(), Wait()
60
61 INTERNALS
62     If you want to preserve all the registers, replace this function
63     in your $(KERNEL) directory. Otherwise this function is
64     satisfactory.
65
66 HISTORY
67
68 ******************************************************************************/
69 #undef Exec
70 {
71     AROS_LIBFUNC_INIT
72
73     /*
74         Task switches are allowed again, if a switch is pending, we
75         should allow it.
76      */
77
78     AROS_ATOMIC_DEC(SysBase->TDNestCnt);
79 #if AROS_SMP
80     if (KernelBase)
81         KrnScheduling(TRUE);
82 #else
83 #error 1
84 #endif
85
86     if(    ( SysBase->TDNestCnt < 0 )
87         && ( SysBase->IDNestCnt < 0 )
88         && ( THISCPU->AttnResched & 0x80 ) )
89     {
90         /* Haha, you re-enabled multitasking, only to have the rug
91            pulled out from under you feet :)
92
93            Clear the Switch() pending flag.
94          */
95
96         if (KernelBase && !KrnIsSuper()) KrnSchedule();
97     }
98
99     AROS_LIBFUNC_EXIT
100 } /* Permit() */