1#!/bin/sh
2
3checkonly=no
4
5if [ "X$1" = "X--check" ] ; then
6    checkonly=yes
7
8    pid=$2
9    name=$3
10else
11    name=$1
12    pid=$2
13fi
14
15
16ec=0
17
18rm -f leaks-log > /dev/null
19
20# leaks dies on asan (rdar://14724199)
21if [ "$(uname -s)" = "Darwin" -a X"$asan" = X ]; then
22    echo "leaks check on $name ($pid)"
23    leaks -exclude __CFInitialize $pid > leaks-log 2>&1 || \
24        { echo "leaks failed: $?"; cat leaks-log; exit 1; }
25
26    perl -e 'my $excluded = 0; my $num = -1; while (<>) {
27if (/Process \d+: (\d+) leaks? for \d+ total leaked bytes?/) { $num = $1;}
28if (/Process \d+: (\d+) leaks? malloced for \d+ total leaked byte?/) { $num = $1;}
29if (/(\d+) leaks? excluded/) { $excluded = $1;}
30}
31exit 1 if ($num != 0 && $num != $excluded);
32exit 0;' leaks-log || \
33	{ echo "Memory leak in $name" ; echo ""; cat leaks-log; ec=1; }
34
35    if grep -e '1 leak for' leaks-log > /dev/null && grep -e "Leak.*environ.*__CF_USER_TEXT_ENCODING" leaks-log > /dev/null ; then
36	echo "just running into rdar://problem/8764394"
37	ec=0
38    fi
39
40    [ "$ec" != "0" ] && { echo ""; cat leaks-log ; }
41
42    #[ "$ec" != "0" ] && { malloc_history $pid -all_by_size > l; }
43    #[ "$ec" != "0" ] && { env PS1=": leaks-debugger !!!! ; " bash ; }
44
45    [ "$ec" = "0" ] && rm leaks-log
46
47fi
48
49if [ "$checkonly" = no ] ; then
50    kill $pid
51    sleep 3
52    kill -9 $pid 2> /dev/null
53    sleep 3
54fi
55
56exit $ec
57