2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
5 Desc: Permit() - Allow tasks switches to occur.
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>
18 #include "../kernel/kernel_intern.h"
27 AROS_LH0(void, Permit
,
30 struct ExecBase
*, SysBase
, 23, Exec
)
33 This function will reactivate the task dispatcher after a call
34 to Forbid(). Note that calls to Forbid() nest, and for every
35 call to Forbid() you need a matching call to Permit().
41 Multitasking will be re-enabled.
44 This function preserves all registers.
46 To prevent deadlocks calling Wait() in forbidden state breaks
47 the forbid - thus taskswitches may happen again.
50 No you really don't want to use this function.
53 The only architecture that you can rely on the registers being
54 saved is on the Motorola mc68000 family.
57 Forbid(), Disable(), Enable(), Wait()
60 If you want to preserve all the registers, replace this function
61 in your $(KERNEL) directory. Otherwise this function is
66 ******************************************************************************/
71 void *KernelBase
= getKernelBase();
74 Task switches are allowed again, if a switch is pending, we
78 AROS_ATOMIC_DEC(SysBase
->TDNestCnt
);
80 if( ( SysBase
->TDNestCnt
< 0 )
81 && ( SysBase
->IDNestCnt
< 0 )
82 && ( SysBase
->AttnResched
& 0x80 ) )
84 /* Haha, you re-enabled multitasking, only to have the rug
85 pulled out from under you feet :)
87 Clear the Switch() pending flag.
90 if (KernelBase
&& !KrnIsSuper()) KrnSchedule();