当前位置: 首页 > news >正文

淘宝代购网站建设百度营销推广登录平台

淘宝代购网站建设,百度营销推广登录平台,做网站 没内容,东莞市义务教育阶段统一招生平台文章系列 1.linux工作队列 - workqueue总览 2.linux工作队列 - workqueue_struct创建 3.linux工作队列 - 把work_struct加入工作队列 4.linux工作队列 - work_struct被调用过程 把work_struct加入工作队列 把work_struct加入到工作队列workqueue的API在系列文章1有介绍&a…

文章系列

1.linux工作队列 - workqueue总览
2.linux工作队列 - workqueue_struct创建
3.linux工作队列 - 把work_struct加入工作队列
4.linux工作队列 - work_struct被调用过程

把work_struct加入工作队列

把work_struct加入到工作队列workqueue的API在系列文章1有介绍,这些API虽然用法不一,但是最终都会调用__queue_work()函数来进行实际加入操作,比如API:queue_work_on:

bool queue_work_on(int cpu, struct workqueue_struct *wq,struct work_struct *work)
{bool ret = false;unsigned long flags;local_irq_save(flags);if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) {__queue_work(cpu, wq, work);------调用到__queue_workret = true;}local_irq_restore(flags);return ret;
}

下面分析__queue_work的代码,如下:

static void __queue_work(int cpu, struct workqueue_struct *wq,struct work_struct *work)
{struct pool_workqueue *pwq;struct worker_pool *last_pool;struct list_head *worklist;unsigned int work_flags;unsigned int req_cpu = cpu;/** While a work item is PENDING && off queue, a task trying to* steal the PENDING will busy-loop waiting for it to either get* queued or lose PENDING.  Grabbing PENDING and queueing should* happen with IRQ disabled.*/WARN_ON_ONCE(!irqs_disabled());debug_work_activate(work);/* if draining, only works from the same workqueue are allowed */if (unlikely(wq->flags & __WQ_DRAINING) &&WARN_ON_ONCE(!is_chained_work(wq)))return;
retry:if (req_cpu == WORK_CPU_UNBOUND)cpu = wq_select_unbound_cpu(raw_smp_processor_id());//根据传入的参数struct workqueue_struct *wq来选择需要的类型/* pwq which will be used unless @work is executing elsewhere */if (!(wq->flags & WQ_UNBOUND))pwq = per_cpu_ptr(wq->cpu_pwqs, cpu);----------------得到bound类型的pool_workqueue elsepwq = unbound_pwq_by_node(wq, cpu_to_node(cpu));-----得到unbound类型的pool_workqueue /** If @work was previously on a different pool, it might still be* running there, in which case the work needs to be queued on that* pool to guarantee non-reentrancy.*///work有可能已经存在另一个不同的work pool中,它可能仍旧在运行,为了避免重入,work仍然要加入到原来的work poollast_pool = get_work_pool(work);if (last_pool && last_pool != pwq->pool) {struct worker *worker;spin_lock(&last_pool->lock);worker = find_worker_executing_work(last_pool, work);if (worker && worker->current_pwq->wq == wq) {pwq = worker->current_pwq;----------------------得到last的pool_workqueue} else {/* meh... not running there, queue here */spin_unlock(&last_pool->lock);spin_lock(&pwq->pool->lock);}} else {spin_lock(&pwq->pool->lock);}/** pwq is determined and locked.  For unbound pools, we could have* raced with pwq release and it could already be dead.  If its* refcnt is zero, repeat pwq selection.  Note that pwqs never die* without another pwq replacing it in the numa_pwq_tbl or while* work items are executing on it, so the retrying is guaranteed to* make forward-progress.*/if (unlikely(!pwq->refcnt)) {if (wq->flags & WQ_UNBOUND) {spin_unlock(&pwq->pool->lock);cpu_relax();goto retry;}/* oops */WARN_ONCE(true, "workqueue: per-cpu pwq for %s on cpu%d has 0 refcnt",wq->name, cpu);}/* pwq determined, queue */trace_workqueue_queue_work(req_cpu, pwq, work);if (WARN_ON(!list_empty(&work->entry))) {spin_unlock(&pwq->pool->lock);return;}pwq->nr_in_flight[pwq->work_color]++;work_flags = work_color_to_flags(pwq->work_color);if (likely(pwq->nr_active < pwq->max_active)) {trace_workqueue_activate_work(work);pwq->nr_active++;worklist = &pwq->pool->worklist;----------------得到pool_workqueue的worker_pool的worklistif (list_empty(worklist))pwq->pool->watchdog_ts = jiffies;} else {work_flags |= WORK_STRUCT_DELAYED;worklist = &pwq->delayed_works;}insert_work(pwq, work, worklist, work_flags);-----把work加入到worklist,并唤醒spin_unlock(&pwq->pool->lock);
}

看函数insert_work代码:

static void insert_work(struct pool_workqueue *pwq, struct work_struct *work,struct list_head *head, unsigned int extra_flags)
{struct worker_pool *pool = pwq->pool;/* we own @work, set data and link */set_work_pwq(work, pwq, extra_flags);list_add_tail(&work->entry, head);---------------加入work pool的链表get_pwq(pwq);/** Ensure either wq_worker_sleeping() sees the above* list_add_tail() or we see zero nr_running to avoid workers lying* around lazily while there are works to be processed.*/smp_mb();if (__need_more_worker(pool))wake_up_worker(pool);----------------------唤醒work pool
}
http://www.hkea.cn/news/659858/

相关文章:

  • 沈阳人流seo优化师就业前景
  • 开发区网站制作公司seo关键词有话要多少钱
  • 网站被篡改处理app拉新平台
  • 在线房屋设计网站seo推广平台服务
  • 电子政务门户网站建设代码短链接生成网址
  • 崔各庄地区网站建设百度非企渠道开户
  • 怎么用自己的电脑做网站服务器产品推广平台排行榜
  • 中国做的比较好的电商网站有哪些哈市今日头条最新
  • 微信怎么做网站推广百度网站优化培训
  • 网站开发支持多个币种电子技术培训机构
  • 移动网站设计与制作怎么找关键词
  • 国内移动端网站做的最好的厦门人才网597人才网
  • 建网站收费吗aso关键词覆盖优化
  • 西安的网站设计与制作首页微信视频号怎么推广引流
  • 顺义公司建站多少钱pc端百度
  • wordpress收费资源下载关键词优化的策略
  • 广州做网站建设的公司网站公司
  • 做网络平台的网站有哪些广州网站维护
  • 网页 代码怎么做网站东莞市民最新疫情
  • 电子商务网站设计中影响客户体验的元素有搜索引擎有哪些种类
  • 网站建设难点优化关键词技巧
  • 免费行情网站链接百度知道合伙人官网
  • 餐饮公司网站建设的特点大数据智能营销
  • 济南快速排名刷关键词排名seo软件
  • 系统做网站的地方百度推广登录后台登录入口
  • 集约化网站建设情况广告公司网站制作
  • 网站制作发票字节跳动广告代理商加盟
  • 义乌做网站武汉seo推广优化公司
  • 济宁哪家网站建设公司正规谷歌浏览器 免费下载
  • 有没有女的做任务的网站广东省新闻