#define __NO_VERSION__ #include #include #include #include #include #include #include #include #include struct proc_dir_entry *rwsem_proc; struct rw_semaphore rwsem_sem; static int rwsem_write_proc(struct file *file, const char *buffer, unsigned long count, void *data) { printk("[%05d %08x]: downing\n",current->pid,rwsem_sem.count); down_write(&rwsem_sem); printk("[%05d %08x]: downed\n",current->pid,rwsem_sem.count); mdelay(1); printk("[%05d %08x]: upping\n",current->pid,rwsem_sem.count); up_write(&rwsem_sem); printk("[%05d %08x]: upped\n",current->pid,rwsem_sem.count); mdelay(100); printk("[%05d %08x]: downing\n",current->pid,rwsem_sem.count); down_write(&rwsem_sem); printk("[%05d %08x]: downed\n",current->pid,rwsem_sem.count); mdelay(1); printk("[%05d %08x]: upping\n",current->pid,rwsem_sem.count); up_write(&rwsem_sem); printk("[%05d %08x]: upped\n",current->pid,rwsem_sem.count); return -ENOENT; } static int __init rwsem_init_module(void) { printk(KERN_INFO "rwsem loading...\n"); init_rwsem(&rwsem_sem); /* try and create the access point */ rwsem_proc = create_proc_entry("rwsem",S_IRUGO|S_IWUGO,NULL); if (!rwsem_proc) return -EEXIST; rwsem_proc->write_proc = &rwsem_write_proc; return 0; } static void __exit rwsem_cleanup_module(void) { printk(KERN_INFO "rwsem unloading\n"); remove_proc_entry("rwsem",NULL); } module_init(rwsem_init_module); module_exit(rwsem_cleanup_module);