diff options
| -rw-r--r-- | ipc/sem.c | 27 |
1 files changed, 22 insertions, 5 deletions
| @@ -752,19 +752,29 @@ static void do_smart_update(struct sem_array *sma, struct sembuf *sops, int nsop | |||
| 752 | int otime, struct list_head *pt) | 752 | int otime, struct list_head *pt) |
| 753 | { | 753 | { |
| 754 | int i; | 754 | int i; |
| 755 | int progress; | ||
| 755 | 756 | ||
| 756 | if (sma->complex_count || sops == NULL) { | 757 | progress = 1; |
| 757 | if (update_queue(sma, -1, pt)) | 758 | retry_global: |
| 759 | if (sma->complex_count) { | ||
| 760 | if (update_queue(sma, -1, pt)) { | ||
| 761 | progress = 1; | ||
| 758 | otime = 1; | 762 | otime = 1; |
| 763 | sops = NULL; | ||
| 764 | } | ||
| 759 | } | 765 | } |
| 766 | if (!progress) | ||
| 767 | goto done; | ||
| 760 | 768 | ||
| 761 | if (!sops) { | 769 | if (!sops) { |
| 762 | /* No semops; something special is going on. */ | 770 | /* No semops; something special is going on. */ |
| 763 | for (i = 0; i < sma->sem_nsems; i++) { | 771 | for (i = 0; i < sma->sem_nsems; i++) { |
| 764 | if (update_queue(sma, i, pt)) | 772 | if (update_queue(sma, i, pt)) { |
| 765 | otime = 1; | 773 | otime = 1; |
| 774 | progress = 1; | ||
| 775 | } | ||
| 766 | } | 776 | } |
| 767 | goto done; | 777 | goto done_checkretry; |
| 768 | } | 778 | } |
| 769 | 779 | ||
| 770 | /* Check the semaphores that were modified. */ | 780 | /* Check the semaphores that were modified. */ |
| @@ -772,8 +782,15 @@ static void do_smart_update(struct sem_array *sma, struct sembuf *sops, int nsop | |||
| 772 | if (sops[i].sem_op > 0 || | 782 | if (sops[i].sem_op > 0 || |
| 773 | (sops[i].sem_op < 0 && | 783 | (sops[i].sem_op < 0 && |
| 774 | sma->sem_base[sops[i].sem_num].semval == 0)) | 784 | sma->sem_base[sops[i].sem_num].semval == 0)) |
| 775 | if (update_queue(sma, sops[i].sem_num, pt)) | 785 | if (update_queue(sma, sops[i].sem_num, pt)) { |
| 776 | otime = 1; | 786 | otime = 1; |
| 787 | progress = 1; | ||
| 788 | } | ||
| 789 | } | ||
| 790 | done_checkretry: | ||
| 791 | if (progress) { | ||
| 792 | progress = 0; | ||
| 793 | goto retry_global; | ||
| 777 | } | 794 | } |
| 778 | done: | 795 | done: |
| 779 | if (otime) | 796 | if (otime) |
