#define __NO_VERSION__ #include #include #include #include #include #include #include #include #include #define kdebug(FMT,...) //#define kdebug printk MODULE_AUTHOR("David Howells"); MODULE_DESCRIPTION("R/W semaphore test demo"); struct proc_dir_entry *rwsem_proc; struct rw_semaphore rwsem_sem; static int rwsem_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { kdebug("[%d] r-downing: %08x\n",current->pid,rwsem_sem.count.counter); down_read(&rwsem_sem); kdebug("[%d] r-downed: %08x\n",current->pid,rwsem_sem.count.counter); mdelay(2); kdebug("[%d] r-upping: %08x\n",current->pid,rwsem_sem.count.counter); up_read(&rwsem_sem); kdebug("[%d] r-upped: %08x\n",current->pid,rwsem_sem.count.counter); return -ENOENT; } static int rwsem_write_proc(struct file *file, const char *buffer, unsigned long count, void *data) { kdebug("[%d] w-downing: %08x\n",current->pid,rwsem_sem.count.counter); down_write(&rwsem_sem); kdebug("[%d] w-downed: %08x\n",current->pid,rwsem_sem.count.counter); mdelay(2); kdebug("[%d] w-upping: %08x\n",current->pid,rwsem_sem.count.counter); up_write(&rwsem_sem); kdebug("[%d] w-upped: %08x\n",current->pid,rwsem_sem.count.counter); return -ENOENT; } static int __init rwsem_init_module(void) { kdebug(KERN_INFO "rwsem loading...\n"); init_rwsem(&rwsem_sem); rwsem_proc = create_proc_entry("rwsem",S_IRUGO|S_IWUGO,NULL); if (!rwsem_proc) return -EEXIST; rwsem_proc->read_proc = &rwsem_read_proc; rwsem_proc->write_proc = &rwsem_write_proc; return 0; } static void __exit rwsem_cleanup_module(void) { kdebug(KERN_INFO "rwsem unloading\n"); remove_proc_entry("rwsem",NULL); } module_init(rwsem_init_module); module_exit(rwsem_cleanup_module);