免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 805 | 回复: 0
打印 上一主题 下一主题

工作队列 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-18 13:50 |只看该作者 |倒序浏览
#include
#include
#include
#include
#include
#include
#include
#define err(msg) printk(KERN_ALERT "%s\n", msg)
#define DATAALIGN (sizeof(unsigned long) - 1)
static void sendwork(struct work_struct *arg);
static void recvwork(struct work_struct *arg);
struct buff_struct_head {
struct buff_struct *prev;
struct buff_struct *next;
spinlock_t lock;
};
struct buff_struct {
struct buff_struct *prev;
struct buff_struct *next;

char data[0];
};
static struct buff_struct_head head = {
.prev = (struct buff_struct *)&head,
.next = (struct buff_struct *)&head,
.lock = SPIN_LOCK_UNLOCKED,
};
static struct workqueue_struct *sender;
static struct workqueue_struct *recver;
static DECLARE_WORK(sender_work, sendwork);
static DECLARE_WORK(recver_work, recvwork);
static void buff_queue_tail(struct buff_struct_head *list, struct buff_struct *newsk)
{
struct buff_struct *prev, *next;
unsigned long flags;
spin_lock_irqsave(&list->lock, flags);
next = (struct buff_struct *)list;
prev = next->prev;
newsk->next = next;
newsk->prev = prev;
next->prev  = prev->next = newsk;
spin_unlock_irqrestore(&list->lock, flags);
}
static struct buff_struct * buff_dequeue(struct buff_struct_head *list)
{
struct buff_struct *next, *prev, *result;
unsigned long flags;
spin_lock_irqsave(&list->lock, flags);
prev = (struct buff_struct *) list;
next = prev->next;
result = NULL;
if (next != prev) {
  result      = next;
  next      = next->next;
  next->prev   = prev;
  prev->next   = next;
  result->next = result->prev = NULL;
}
spin_unlock_irqrestore(&list->lock, flags);
return result;
}
static void sendwork(struct work_struct *arg)
{
struct buff_struct *t;
int i;
char data[] = "abcdefg";
int len = (sizeof(struct buff_struct) + strlen(data) + DATAALIGN) & ~DATAALIGN;

for (i = 0; i
  memset(t, '\0', len);
  memcpy(t->data, data, strlen(data));

  buff_queue_tail(&head, t);
}
}
static void recvwork(struct work_struct *arg)
{
struct buff_struct *t;
int count = 0;
while (1) {
  t = buff_dequeue(&head);
  if (t) {
   printk(KERN_ALERT "%s\n", t->data);
   kfree(t);
   if (++count == 10)
    break;
  }
  
  msleep(10);
}
}
static int workqueue_init(void)
{
sender = create_workqueue("sender");
recver = create_workqueue("recver");
queue_work(sender, &sender_work);
queue_work(recver, &recver_work);
return 0;
}
static void workqueue_exit(void)
{
flush_workqueue(sender);
flush_workqueue(recver);
printk(KERN_ALERT "workqueue_exit\n");
}
module_init(workqueue_init);
module_exit(workqueue_exit);
MODULE_LICENSE("GPL");


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/63604/showart_1932098.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP