/**
 * Worker function for RTThreadCtxHooks(Deregister|Release)().
 *
 * @param   pThis   Pointer to the internal thread-context object.
 */
DECLINLINE(void) rtThreadCtxHooksDeregister(PRTTHREADCTXINT pThis)
{
    preempt_notifier_unregister(&pThis->hPreemptNotifier);
    pThis->hPreemptOps.sched_out = NULL;
    pThis->hPreemptOps.sched_in  = NULL;
    pThis->fRegistered           = false;
}
/**
 * Worker function for RTThreadCtxHooks(Deregister|Release)().
 *
 * @param   pThis   Pointer to the internal thread-context object.
 */
DECLINLINE(void) rtThreadCtxHookDisable(PRTTHREADCTXHOOKINT pThis)
{
    Assert(pThis->PreemptOps.sched_out == rtThreadCtxHooksLnxSchedOut);
    Assert(pThis->PreemptOps.sched_in  == rtThreadCtxHooksLnxSchedIn);
    preempt_disable();
    preempt_notifier_unregister(&pThis->LnxPreemptNotifier);
    pThis->fEnabled = false;
    preempt_enable();
}
//Ä£¿éŒÓÔغ¯Êý¶šÒå
static int __init preempt_notifer_unregister_init(void)
{	
	int result;
	printk("<0>into preempt_notifer_unregister_init.\n");				
	result=kernel_thread(my_function,NULL,CLONE_KERNEL); //ŽŽœšÐÂœø³Ì
	ops.sched_in=sched_in; //³õÊŒ»¯œø³ÌÇÀÕŒ²Ù×÷±äÁ¿
       ops.sched_out=sched_out;
	preempt_notifier_init(&notifier,&ops);  //³õÊŒ»¯œø³ÌÇÀՌ͚֪Æ÷
	preempt_notifier_register(&notifier); //×¢²áœø³ÌÇÀՌ͚֪Æ÷
	preempt_notifier_unregister(&notifier); //ÊŸÀý1£¬×¢Ïúœø³ÌÇÀՌ͚֪Æ÷
	printk("<0>the result of the kernel_thread is :%d\n",result); //ÏÔÊŸº¯Êýkernel_thread()º¯ÊýµÄ·µ»Øœá¹û
	printk("<0>the current pid is:%d\n",current->pid); //ÏÔÊŸµ±Ç°œø³ÌPIDÖµ
	printk("<0>out preempt_notifer_unregister_init.\n");
	return 0;
}