The change (008fa749e0fe5b2fffd20b7fe4891bb80d072c6a) that moved the node release code to a separate function broke death notifications in some cases. When it encountered a reference without a death notification request, it would skip looking at the remaining references, and therefore fail to send death notifications for them.
Unified · Split
| @@ -2904,7 +2904,7 @@ static int binder_node_release(struct binder_node *node, int refs) · 2903 unmodified lines | |||
| 2904 | refs++; | 2904 | refs++; |
| 2905 | 2905 | ||
| 2906 | if (!ref->death) | 2906 | if (!ref->death) |
| 2907 | goto out; | 2907 | continue; |
| 2908 | 2908 | ||
| 2909 | death++; | 2909 | death++; |
| 2910 | 2910 | ||
| @@ -2917,7 +2917,6 @@ static int binder_node_release(struct binder_node *node, int refs) · 6 unmodified lines | |||
| 2917 | BUG(); | 2917 | BUG(); |
| 2918 | } | 2918 | } |
| 2919 | 2919 | ||
| 2920 | out: | ||
| 2921 | binder_debug(BINDER_DEBUG_DEAD_BINDER, | 2920 | binder_debug(BINDER_DEBUG_DEAD_BINDER, |
| 2922 | "node %d now dead, refs %d, death %d\n", | 2921 | "node %d now dead, refs %d, death %d\n", |
| 2923 | node->debug_id, refs, death); | 2922 | node->debug_id, refs, death); |