RTDECL(int) RTThreadCtxHookEnable(RTTHREADCTXHOOK hCtxHook) { /* * Validate input. */ PRTTHREADCTXHOOKINT pThis = hCtxHook; AssertPtr(pThis); AssertMsgReturn(pThis->u32Magic == RTTHREADCTXHOOKINT_MAGIC, ("pThis->u32Magic=%RX32 pThis=%p\n", pThis->u32Magic, pThis), VERR_INVALID_HANDLE); Assert(pThis->hOwner == RTThreadNativeSelf()); Assert(!pThis->fEnabled); if (!pThis->fEnabled) { IPRT_LINUX_SAVE_EFL_AC(); Assert(pThis->PreemptOps.sched_out == rtThreadCtxHooksLnxSchedOut); Assert(pThis->PreemptOps.sched_in == rtThreadCtxHooksLnxSchedIn); /* * Register the callback. */ preempt_disable(); pThis->fEnabled = true; preempt_notifier_register(&pThis->LnxPreemptNotifier); preempt_enable(); IPRT_LINUX_RESTORE_EFL_AC(); } return VINF_SUCCESS; }
RTDECL(int) RTThreadCtxHooksRegister(RTTHREADCTX hThreadCtx, PFNRTTHREADCTXHOOK pfnThreadCtxHook, void *pvUser) { /* * Validate input. */ PRTTHREADCTXINT pThis = hThreadCtx; if (pThis == NIL_RTTHREADCTX) return VERR_INVALID_HANDLE; AssertPtr(pThis); AssertMsgReturn(pThis->u32Magic == RTTHREADCTXINT_MAGIC, ("pThis->u32Magic=%RX32 pThis=%p\n", pThis->u32Magic, pThis), VERR_INVALID_HANDLE); Assert(pThis->hOwner == RTThreadNativeSelf()); Assert(!pThis->hPreemptOps.sched_out); Assert(!pThis->hPreemptOps.sched_in); /* * Register the callback. */ pThis->hPreemptOps.sched_out = rtThreadCtxHooksLnxSchedOut; pThis->hPreemptOps.sched_in = rtThreadCtxHooksLnxSchedIn; pThis->pvUser = pvUser; pThis->pfnThreadCtxHook = pfnThreadCtxHook; pThis->fRegistered = true; preempt_notifier_register(&pThis->hPreemptNotifier); return VINF_SUCCESS; }
//Ä£¿éŒÓÔغ¯Êý¶šÒå 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(¬ifier,&ops); //³õÊŒ»¯œø³ÌÇÀՌ͚֪Æ÷ preempt_notifier_register(¬ifier); //×¢²áœø³ÌÇÀՌ͚֪Æ÷ preempt_notifier_unregister(¬ifier); //ÊŸÀý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; }