//Ä£¿éŒÓÔغ¯Êý¶šÒå 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; }
RTDECL(int) RTThreadCtxHooksCreate(PRTTHREADCTX phThreadCtx) { PRTTHREADCTXINT pThis; Assert(RTThreadPreemptIsEnabled(NIL_RTTHREAD)); pThis = (PRTTHREADCTXINT)RTMemAllocZ(sizeof(*pThis)); if (RT_UNLIKELY(!pThis)) return VERR_NO_MEMORY; pThis->u32Magic = RTTHREADCTXINT_MAGIC; pThis->hOwner = RTThreadNativeSelf(); pThis->fRegistered = false; preempt_notifier_init(&pThis->hPreemptNotifier, &pThis->hPreemptOps); pThis->cRefs = 1; *phThreadCtx = pThis; return VINF_SUCCESS; }
RTDECL(int) RTThreadCtxHookCreate(PRTTHREADCTXHOOK phCtxHook, uint32_t fFlags, PFNRTTHREADCTXHOOK pfnCallback, void *pvUser) { IPRT_LINUX_SAVE_EFL_AC(); /* * Validate input. */ PRTTHREADCTXHOOKINT pThis; Assert(RTThreadPreemptIsEnabled(NIL_RTTHREAD)); AssertPtrReturn(pfnCallback, VERR_INVALID_POINTER); AssertReturn(fFlags == 0, VERR_INVALID_FLAGS); /* * Allocate and initialize a new hook. We don't register it yet, just * create it. */ pThis = (PRTTHREADCTXHOOKINT)RTMemAllocZ(sizeof(*pThis)); if (RT_UNLIKELY(!pThis)) { IPRT_LINUX_RESTORE_EFL_AC(); return VERR_NO_MEMORY; } pThis->u32Magic = RTTHREADCTXHOOKINT_MAGIC; pThis->hOwner = RTThreadNativeSelf(); pThis->fEnabled = false; pThis->pfnCallback = pfnCallback; pThis->pvUser = pvUser; preempt_notifier_init(&pThis->LnxPreemptNotifier, &pThis->PreemptOps); pThis->PreemptOps.sched_out = rtThreadCtxHooksLnxSchedOut; pThis->PreemptOps.sched_in = rtThreadCtxHooksLnxSchedIn; #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) preempt_notifier_inc(); #endif *phCtxHook = pThis; IPRT_LINUX_RESTORE_EFL_AC(); return VINF_SUCCESS; }