一是对uaddr进行hash,找到futex_hash_bucket并获取它上面的自旋锁,二是判断*uaddr是否为预期值。如果...
在futex_wait_setup方法中会加自旋锁;在futex_wait_queue_me中将状态设置为TASK_INTERRUPTIBLE,调用queue_me将当期线程插入到等待队列中,然后才释放自旋锁。也就是说检查uaddr的值的过程跟进程挂起的过程放在同一个临界区中。当释放自旋锁后,这时再更改addr地址的值已经没有关系了,因为当期进程已经加入到等待队列中,...
retry:/** Prepare to wait on uaddr. On success, it holds hb->lock and q * is initialized.*/ret= futex_wait_setup(uaddr, val, flags, &q, &hb);if(ret)gotoout;/*futex_queue and wait for wakeup, timeout, or a signal.*/futex_wait_queue(hb,&q, to); ... } 第一步,设置tim...
*/ret= futex_wait_setup(uaddr, val, flags, &q, &hb);if(ret)gotoout;/*---走到这里了,就表示 *uaddr == val 成立的,接下来就要让当前进程休眠了---*//** queue_me and wait for wakeup, timeout, or a signal. * * 当前进程状态改为 TASK_INTERRUPTIBLE,并插入到futex等待队列,然后释放 ...
futex_wait /* * 1. 加futex_hash_bucket中自旋锁 * 2. futex_wait_setup:初始化futex_q * 3. futex_wait_queue_me:futex_q加入到对应的hash bucket中,建立 futex和等待进程的关系,释放自旋锁;启动hrtimer定时器,挂起进程重新调度 * 4. restart_block *restart什么用?赋值回来有什么意义?*/staticintfutex...
ret = futex_wait_setup(uaddr, val, fshared, &q, &hb); //如果val发生了改变,则直接返回 if (ret) goto out; //将当前进程状态改为TASK_INTERRUPTIBLE,并插入到futex等待队列,然后重新调度。 futex_wait_queue_me(hb, &q, to); /* If we were woken (and unqueued), we succeeded, whatever....
ret = futex_wait_setup(uaddr, val, fshared, &q, &hb); //如果val发生了改变,则直接返回 if (ret) goto out; //将当前进程状态改为TASK_INTERRUPTIBLE,并插入到futex等待队列,然后重新调度。 futex_wait_queue_me(hb, &q, to); /* If we were woken (and unqueued), we succeeded, whatever....
在futex_wait_setup方法中会加自旋锁;在futex_wait_queue_me中将状态设置为TASK_INTERRUPTIBLE,调用queue_me将当期线程插入到等待队列中,然后才释放自旋锁。也就是说检查uaddr的值的过程跟进程挂起的过程放在同一个临界区中。当释放自旋锁后,这时再更改addr地址的值已经没有关系了,因为当期进程已经加入到等待队列中,...
在futex_wait_setup方法中会加自旋锁;在futex_wait_queue_me中将状态设置为TASK_INTERRUPTIBLE,调用queue_me将当期线程插入到等待队列中,然后才释放自旋锁。也就是说检查uaddr的值的过程跟进程挂起的过程放在同一个临界区中。当释放自旋锁后,这时再更改addr地址的值已经没有关系了,因为当期进程已经加入到等待队列中,...
22ret = futex_wait_setup(uaddr, val, flags, &q, &hb); 23if(ret) 24gotoout; 25 26/* queue_me and wait for wakeup, timeout, or a signal. */ 27/*将当前任务状态改为TASK_INTERRUPTIBLE,并将当前任务插入到futex等待队列,释放哈希桶自旋锁,然后重新调度*/ ...