Rev 1264 | Rev 1460 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1264 | Rev 1414 | ||
---|---|---|---|
Line 117... | Line 117... | ||
117 | if (!t || !PTE_VALID(t) || !PTE_PRESENT(t)) { |
117 | if (!t || !PTE_VALID(t) || !PTE_PRESENT(t)) { |
118 | page_table_unlock(AS, true); |
118 | page_table_unlock(AS, true); |
119 | interrupts_restore(ipl); |
119 | interrupts_restore(ipl); |
120 | return (__native) ENOENT; |
120 | return (__native) ENOENT; |
121 | } |
121 | } |
122 | paddr = PFN2ADDR(PTE_GET_FRAME(t)) + (uaddr - ALIGN_DOWN(uaddr, PAGE_SIZE)); |
122 | paddr = PTE_GET_FRAME(t) + (uaddr - ALIGN_DOWN(uaddr, PAGE_SIZE)); |
123 | page_table_unlock(AS, true); |
123 | page_table_unlock(AS, true); |
124 | 124 | ||
125 | interrupts_restore(ipl); |
125 | interrupts_restore(ipl); |
126 | 126 | ||
127 | futex = futex_find(paddr); |
127 | futex = futex_find(paddr); |
Line 131... | Line 131... | ||
131 | 131 | ||
132 | /** Wakeup one thread waiting in futex wait queue. |
132 | /** Wakeup one thread waiting in futex wait queue. |
133 | * |
133 | * |
134 | * @param uaddr Userspace address of the futex counter. |
134 | * @param uaddr Userspace address of the futex counter. |
135 | * |
135 | * |
136 | * @return ENOENT if there is no futex associated with the address |
- | |
137 | * or if there is no physical mapping for uaddr. |
136 | * @return ENOENT if there is no physical mapping for uaddr. |
138 | */ |
137 | */ |
139 | __native sys_futex_wakeup(__address uaddr) |
138 | __native sys_futex_wakeup(__address uaddr) |
140 | { |
139 | { |
141 | futex_t *futex; |
140 | futex_t *futex; |
142 | __address paddr; |
141 | __address paddr; |
Line 153... | Line 152... | ||
153 | if (!t || !PTE_VALID(t) || !PTE_PRESENT(t)) { |
152 | if (!t || !PTE_VALID(t) || !PTE_PRESENT(t)) { |
154 | page_table_unlock(AS, true); |
153 | page_table_unlock(AS, true); |
155 | interrupts_restore(ipl); |
154 | interrupts_restore(ipl); |
156 | return (__native) ENOENT; |
155 | return (__native) ENOENT; |
157 | } |
156 | } |
158 | paddr = PFN2ADDR(PTE_GET_FRAME(t)) + (uaddr - ALIGN_DOWN(uaddr, PAGE_SIZE)); |
157 | paddr = PTE_GET_FRAME(t) + (uaddr - ALIGN_DOWN(uaddr, PAGE_SIZE)); |
159 | page_table_unlock(AS, true); |
158 | page_table_unlock(AS, true); |
160 | 159 | ||
161 | interrupts_restore(ipl); |
160 | interrupts_restore(ipl); |
162 | 161 | ||
163 | futex = futex_find(paddr); |
162 | futex = futex_find(paddr); |
Line 190... | Line 189... | ||
190 | futex = hash_table_get_instance(item, futex_t, ht_link); |
189 | futex = hash_table_get_instance(item, futex_t, ht_link); |
191 | rwlock_read_unlock(&futex_ht_lock); |
190 | rwlock_read_unlock(&futex_ht_lock); |
192 | } else { |
191 | } else { |
193 | /* |
192 | /* |
194 | * Upgrade to writer is not currently supported, |
193 | * Upgrade to writer is not currently supported, |
195 | * Therefore, it is necessary to release the read lock |
194 | * therefore, it is necessary to release the read lock |
196 | * and reacquire it as a writer. |
195 | * and reacquire it as a writer. |
197 | */ |
196 | */ |
198 | rwlock_read_unlock(&futex_ht_lock); |
197 | rwlock_read_unlock(&futex_ht_lock); |
199 | 198 | ||
200 | rwlock_write_lock(&futex_ht_lock); |
199 | rwlock_write_lock(&futex_ht_lock); |