diff --git a/Chapter8_SOC_与_Linux/8.7_设备驱动中的并发控制.md b/Chapter8_SOC_与_Linux/8.7_设备驱动中的并发控制.md index 6500e97..f79f997 100644 --- a/Chapter8_SOC_与_Linux/8.7_设备驱动中的并发控制.md +++ b/Chapter8_SOC_与_Linux/8.7_设备驱动中的并发控制.md @@ -340,7 +340,7 @@ struct demo_dev { struct cdev cdev; struct device *dev; - rwlock_t demo_rwlock; + struct rw_semaphore demo_rwsemp; // This is a test. char demo_text[DEMO_DATA_SIZE]; }; @@ -351,7 +351,7 @@ static ssize_t demo_read(struct file *filp, char __user *buffer, size_t count, l loff_t p; ssize_t ret = 0; - read_lock(&devp->demo_rwlock); + down_read(&devp->demo_rwsemp); p = *position; // This is a test. @@ -362,13 +362,13 @@ static ssize_t demo_read(struct file *filp, char __user *buffer, size_t count, l count = DEMO_DATA_SIZE-p; if(copy_to_user((void*)buffer, &devp->demo_text[p], count)) { - read_unlock(&devp->demo_rwlock); + up_read(&devp->demo_rwsemp); ret = -EFAULT; } else { *position += count; - read_unlock(&devp->demo_rwlock); + up_read(&devp->demo_rwsemp); ret = count; } return ret; @@ -380,7 +380,7 @@ static ssize_t demo_write(struct file *filp, const char __user *buffer, size_t c loff_t p; ssize_t ret = 0; - write_lock(&devp->demo_rwlock); + down_write(&devp->demo_rwsemp); p = *position; // This is a test. // 分析和获取有效的写长度 @@ -390,12 +390,12 @@ static ssize_t demo_write(struct file *filp, const char __user *buffer, size_t c count = DEMO_DATA_SIZE-p; if(copy_from_user(&devp->demo_text[p], (void*)buffer, count)) { - write_unlock(&devp->demo_rwlock); + up_write(&devp->demo_rwsemp); ret = -EFAULT; } else { *position += count; - write_unlock(&devp->demo_rwlock); + up_write(&devp->demo_rwsemp); ret = count; } @@ -426,7 +426,7 @@ static int demo_setup_cdev(struct demo_dev *devp, int index) devp->demo_text[DEMO_DATA_SIZE-1] = 0; sprintf(devp->demo_text, "%d", index); - rwlock_init(&devp->demo_rwlock); + init_rwsem(&devp->demo_rwsemp); return 0; out_cdev: cdev_del(&devp->cdev);