Index: sysdeps/nacl/futex_emulation.c |
diff --git a/sysdeps/nacl/futex_emulation.c b/sysdeps/nacl/futex_emulation.c |
index 0abb9aff8f4bc614d2023611baeab71daeb57017..30fb4006333bde37f0dbe9cbc7a6f12c630201aa 100644 |
--- a/sysdeps/nacl/futex_emulation.c |
+++ b/sysdeps/nacl/futex_emulation.c |
@@ -90,14 +90,16 @@ ret_no_unlock: |
/* Note: global_futex_emulation_mutex_desc must be taken when called. */ |
static int nacl_futex_wake_nolock (volatile int *addr, int nwake, |
- unsigned int bitset) |
+ unsigned int bitset, |
+ int *count) |
{ |
int retcode = 0; |
list_t *entry; |
list_t *prev; |
+ *count = 0; |
if (nwake <= 0) |
- return retcode; |
+ return 0; |
list_for_each_prev_safe (entry, prev, &waiters_list) |
{ |
@@ -112,24 +114,25 @@ static int nacl_futex_wake_nolock (volatile int *addr, int nwake, |
entry->next = NULL; |
/* Cannot really do anything if error happens here. */ |
__nacl_irt_cond_signal (curr->condvar_desc); |
- retcode++; |
+ (*count)++; |
nwake--; |
if (nwake <= 0) |
- return retcode; |
+ return 0; |
} |
} |
return retcode; |
} |
-int __nacl_futex_wake (volatile int *addr, int nwake, unsigned int bitset) |
+int __nacl_futex_wake (volatile int *addr, int nwake, unsigned int bitset, |
+ int *count) |
{ |
int retcode = 0; |
if (__nacl_irt_mutex_lock (global_futex_emulation_mutex_desc)) |
goto ret_no_unlock; |
- retcode = nacl_futex_wake_nolock (addr, nwake, bitset); |
+ retcode = nacl_futex_wake_nolock (addr, nwake, bitset, count); |
/* Cannot really do anything if error happens here. */ |
__nacl_irt_mutex_unlock (global_futex_emulation_mutex_desc); |
@@ -153,7 +156,8 @@ int __nacl_futex_wake_op (volatile int *addr1, volatile int *addr2, |
int encoded_futex_operation; |
struct decoded_wake_op_operation |
decoded_wake_op_operation; |
- } futex_operation) |
+ } futex_operation, |
+ int *count) |
{ |
int retcode = 0; |
int operation_argument; |
@@ -220,10 +224,16 @@ int __nacl_futex_wake_op (volatile int *addr1, volatile int *addr2, |
goto ret_unlock; |
} |
- retcode = nacl_futex_wake_nolock (addr1, nwake1, __FUTEX_BITSET_MATCH_ANY); |
+ retcode = nacl_futex_wake_nolock (addr1, nwake1, __FUTEX_BITSET_MATCH_ANY, |
+ count); |
- if (old_value) |
- retcode += nacl_futex_wake_nolock (addr2, nwake2, __FUTEX_BITSET_MATCH_ANY); |
+ if (!retcode && old_value) |
+ { |
+ int count2; |
+ retcode = nacl_futex_wake_nolock (addr2, nwake2, __FUTEX_BITSET_MATCH_ANY, |
+ &count2); |
+ (*count) += count2; |
+ } |
ret_unlock: |
/* Cannot really do anything if error happens here. */ |
@@ -233,7 +243,7 @@ ret_no_unlock: |
} |
int __nacl_futex_cmp_requeue (volatile int *addr1, volatile int *addr2, |
- int nwake, int nrequeue, int val) |
+ int nwake, int nrequeue, int val, int *count) |
{ |
int retcode = -EINTR; |
@@ -248,7 +258,7 @@ int __nacl_futex_cmp_requeue (volatile int *addr1, volatile int *addr2, |
else |
{ |
list_t *entry; |
- retcode = nacl_futex_wake_nolock (addr1, nwake, __FUTEX_BITSET_MATCH_ANY); |
+ retcode = nacl_futex_wake_nolock (addr1, nwake, __FUTEX_BITSET_MATCH_ANY, count); |
pasko-google - do not use
2011/09/02 16:25:24
line too long
khim
2011/09/02 16:36:09
Done.
|
if (retcode <= 0 || (waiters_list.next == &waiters_list) || nrequeue <= 0) |
goto ret_unlock_nocheck; |
@@ -265,7 +275,7 @@ int __nacl_futex_cmp_requeue (volatile int *addr1, volatile int *addr2, |
if (curr->addr == addr1) |
{ |
curr->addr = addr2; |
- retcode++; |
+ count++; |
nrequeue--; |
} |
} |