summaryrefslogtreecommitdiff
path: root/src/libpcp/src/check-statics
diff options
context:
space:
mode:
Diffstat (limited to 'src/libpcp/src/check-statics')
-rwxr-xr-xsrc/libpcp/src/check-statics502
1 files changed, 502 insertions, 0 deletions
diff --git a/src/libpcp/src/check-statics b/src/libpcp/src/check-statics
new file mode 100755
index 0000000..6a69435
--- /dev/null
+++ b/src/libpcp/src/check-statics
@@ -0,0 +1,502 @@
+#!/bin/sh
+#
+# Check symbols for static variables against list of exceptions
+# that are known to be thread-safe
+#
+
+set -e # detect syntax errors or subsidiary command failures
+sts=1 # presume failure, in case of an unexpected early exit
+tmp=`mktemp -d /var/tmp/pcp.XXXXXXXXX` || exit 1
+trap "rm -rf $tmp; exit \$sts" 0 1 2 3 15
+
+# Note
+# Really want to make this run on as many platforms as possible ...
+eval `grep PCP_PLATFORM= ../../include/pcp.conf`
+case "$PCP_PLATFORM"
+in
+ linux|darwin)
+ # only works for some architectures ... and in particular not
+ # Power PC!
+ #
+ arch=`uname -m 2>/dev/null`
+ case "$arch"
+ in
+ i?86|x86_64)
+ ;;
+ *)
+ echo "Warning: check-statics skipped for $arch architecture"
+ sts=0
+ exit
+ ;;
+ esac
+ ;;
+ freebsd|netbsd|solaris)
+ ;;
+ *)
+ echo "Warning: check-statics skipped for PCP_PLATFORM=$PCP_PLATFORM"
+ sts=0
+ exit
+ ;;
+esac
+
+obj=''
+cat <<End-of-File \
+| sed -e 's/[ ]*#.*//' \
+ -e '/^$/d' >$tmp/ctl
+# Format for the control file ...
+# All text after a # is treated as a comment
+#
+# Lines consisting of a FOO.o name are assumed to be the name of an
+# object file ... if any object file is found in the current directory
+# that is not named in the control file, this is an error. Object
+# file names beginning with '?' are optional, otherwise the object
+# file is expected to exist.
+#
+# Following the name of an object file follows zero or more lines
+# defining static data symbols from that object file that is known to
+# be thread-safe ... these lines contain the symbol's name and by
+# convention an comment explaining why the symbol is thread-safe. The
+# symbol may be preceded by a '?' character to indicate the symbol may
+# or may not be in the object file, otherwise a symbol named here that
+# is not in the object file produces a warning.
+#
+access.o
+ all_ops # single-threaded PM_SCOPE_ACL
+ gotmyhostid # single-threaded PM_SCOPE_ACL
+ grouplist # single-threaded PM_SCOPE_ACL
+ hostlist # single-threaded PM_SCOPE_ACL
+ myhostid # single-threaded PM_SCOPE_ACL
+ myhostname # single-threaded PM_SCOPE_ACL
+ nhosts # single-threaded PM_SCOPE_ACL
+ ngroups # single-threaded PM_SCOPE_ACL
+ nusers # single-threaded PM_SCOPE_ACL
+ oldgrouplist # single-threaded PM_SCOPE_ACL
+ oldhostlist # single-threaded PM_SCOPE_ACL
+ olduserlist # single-threaded PM_SCOPE_ACL
+ oldngroups # single-threaded PM_SCOPE_ACL
+ oldnhosts # single-threaded PM_SCOPE_ACL
+ oldnusers # single-threaded PM_SCOPE_ACL
+ oldszgrouplist # single-threaded PM_SCOPE_ACL
+ oldszhostlist # single-threaded PM_SCOPE_ACL
+ oldszuserlist # single-threaded PM_SCOPE_ACL
+ saved # single-threaded PM_SCOPE_ACL
+ szhostlist # single-threaded PM_SCOPE_ACL
+ szgrouplist # single-threaded PM_SCOPE_ACL
+ szuserlist # single-threaded PM_SCOPE_ACL
+ userlist # single-threaded PM_SCOPE_ACL
+accounts.o
+AF.o
+ afid # single-threaded PM_SCOPE_AF
+ block # single-threaded PM_SCOPE_AF
+ root # single-threaded PM_SCOPE_AF
+ ?afblock # guarded by __pmLock_libpcp mutex
+ ?afsetup # guarded by __pmLock_libpcp mutex
+ ?aftimer # guarded by __pmLock_libpcp mutex
+auxconnect.o
+ canwait # guarded by __pmLock_libpcp mutex
+ first_time # guarded by __pmLock_libpcp mutex
+ pmcd_ports # guarded by __pmLock_libpcp mutex
+ pmcd_socket # guarded by __pmLock_libpcp mutex
+auxserver.o
+ nport # single-threaded server scope
+ portlist # single-threaded server scope
+ nintf # single-threaded server scope
+ intflist # single-threaded server scope
+ nReqPorts # single-threaded server scope
+ szReqPorts # single-threaded server scope
+ reqPorts # single-threaded server scope
+ localSocketPath # single-threaded server scope
+ serviceSpec # single-threaded server scope
+ localSocketFd # single-threaded server scope
+ server_features # single-threaded server scope
+discovery.o
+?avahi.o
+ nActiveServices # single-threaded server scope
+ szActiveServices # single-threaded server scope
+ activeServices # single-threaded server scope
+ threadedPoll # single-threaded server scope
+ simplePoll # single-threaded server scope
+ client # single-threaded server scope
+ group # single-threaded server scope
+ done_default # guarded by __pmLock_libpcp mutex
+ def_timeout # guarded by __pmLock_libpcp mutex
+checksum.o
+config.o
+ ?__pmNativeConfig # const
+ state # guarded by __pmLock_libpcp mutex
+ ?features # const
+connectlocal.o
+ atexit_installed # guarded by __pmLock_libpcp mutex
+ buffer # assert safe, see notes in connectlocal.c
+ dsotab # assert safe, see notes in connectlocal.c
+ numdso # assert safe, see notes in connectlocal.c
+connect.o
+ global_nports # guarded by __pmLock_libpcp mutex
+ global_portlist # guarded by __pmLock_libpcp mutex
+ first_time # guarded by __pmLock_libpcp mutex
+ proxy # guarded by __pmLock_libpcp mutex
+context.o
+ _mode # const
+ def_backoff # guarded by __pmLock_libpcp mutex
+ backoff # guarded by __pmLock_libpcp mutex
+ n_backoff # guarded by __pmLock_libpcp mutex
+ contexts # guarded by __pmLock_libpcp mutex
+ contexts_len # guarded by __pmLock_libpcp mutex
+ hostbuf # single-threaded
+ ?curcontext # thread private
+ ?__emutls_t.curcontext # thread private (MinGW)
+ ?__emutls_v.curcontext # thread private (MinGW)
+derive_fetch.o
+derive.o
+ ?func # const
+ ?init # local initialize_mutex mutex
+ ?done # guarded by local initialize_mutex mutex
+ type_dbg # const
+ ?type_c # const
+ state_dbg # const
+ ?promote # const
+ ?timefactor # const
+ need_init # guarded by registered.mutex
+ tokbuf # guarded by registered.mutex
+ tokbuflen # guarded by registered.mutex
+ string # guarded by registered.mutex
+ lexpeek # guarded by registered.mutex
+ this # guarded by registered.mutex
+ ?registered # guarded by registered.mutex
+ pmid # guarded by registered.mutex
+ ?derive_errmsg # thread private
+ ?__emutls_v.derive_errmsg # thread private (MinGW)
+ ?func # const (MinGW)
+ ?promote # const (MinGW)
+ ?timefactor # const (MinGW)
+ ?type_c # const (MinGW)
+desc.o
+endian.o
+err.o
+ ?errtab # const
+ ?first # guarded by __pmLock_libpcp mutex
+ unknown # guarded by __pmLock_libpcp mutex or const (MinGW)
+ errmsg # pmErrStr deprecated by pmErrStr_r
+events.o
+ first # guarded by __pmLock_libpcp mutex
+ name_flags # guarded by __pmLock_libpcp mutex
+ name_missed # guarded by __pmLock_libpcp mutex
+ pmid_flags # no unsafe side-effects
+ pmid_missed # no unsafe side-effects
+fault.o
+fetchlocal.o
+ splitlist # single-threaded PM_SCOPE_DSO_PMDA
+ splitmax # single-threaded PM_SCOPE_DSO_PMDA
+fetch.o
+freeresult.o
+getdate.tab.o
+ dst_table # const
+ meridian_table # const
+ military_table # const
+ month_and_day_table # const
+ relative_time_table # const
+ time_units_table # const
+ time_zone_table # const
+ universal_time_zone_table # const
+ yycheck # const
+ yydefact # const
+ yydefgoto # const
+ yypact # const
+ yypgoto # const
+ yyr1 # const
+ yyr2 # const
+ ?yystos # const, may be optimized away
+ ?yyval_default # local to parser ... depends on yacc/bison version
+ yytable # const
+ yytranslate # const
+getopt.o
+hash.o
+help.o
+instance.o
+interp.o
+ dowrap # guarded by __pmLock_libpcp mutex
+ nr # diag counters, no atomic updates
+ nr_cache # diag counters, no atomic updates
+ statestr # const
+ipc.o
+ __pmIPCTable # guarded by __pmLock_libpcp mutex
+ __pmLastUsedFd # guarded by __pmLock_libpcp mutex
+ ipcentrysize # guarded by __pmLock_libpcp mutex
+ ipctablecount # guarded by __pmLock_libpcp mutex
+lock.o
+ __pmLock_libpcp # the global libpcp mutex
+ ?init # local __pmInitLocks mutex
+ ?done # guarded by local __pmInitLocks mutex
+ ?__pmTPDKey # one-trip initialization then read-only
+ ?multi_init # guarded by __pmLock_libpcp mutex
+ ?multi_seen # guarded by __pmLock_libpcp mutex
+ ?hashctl # for lock debug tracing
+ ?__pmTPDKey # if don't have __thread support
+logconnect.o
+ done_default # guarded by __pmLock_libpcp mutex
+ timeout # guarded by __pmLock_libpcp mutex
+logcontrol.o
+logmeta.o
+logportmap.o
+ nlogports # single-threaded PM_SCOPE_LOGPORT
+ szlogport # single-threaded PM_SCOPE_LOGPORT
+ logport # single-threaded PM_SCOPE_LOGPORT
+ match # single-threaded PM_SCOPE_LOGPORT
+logutil.o
+ tbuf # __pmLogName deprecated by __pmLogName_r
+ compress_ctl # const
+ ?ncompress # const
+ __pmLogReads # diag counter, no atomic updates
+ pc_hc # guarded by __pmLock_libpcp mutex
+secureserver.o
+ secure_server # guarded by __pmLock_libpcp mutex
+secureconnect.o
+ common_callbacks # const
+ initialized # single-threaded
+optfetch.o
+ optcost # guarded by __pmLock_libpcp mutex
+p_auth.o
+p_creds.o
+p_desc.o
+pdubuf.o
+ buf_free # guarded by __pmLock_libpcp mutex
+ buf_pin # guarded by __pmLock_libpcp mutex
+ buf_pin_tail # guarded by __pmLock_libpcp mutex
+pdu.o
+ done_default # guarded by __pmLock_libpcp mutex
+ def_timeout # guarded by __pmLock_libpcp mutex
+ def_wait # guarded by __pmLock_libpcp mutex
+ pmDebug # set-once in main(), read-only elsewhere
+ ceiling # no unsafe side-effects
+ ?sigpipe_done # no unsafe side-effects
+ mypid # no unsafe side-effects
+ tbuf # __pmPDUTypeStr deprecated by __pmPDUTypeStr_r
+ __pmPDUCntIn # pointer to diag counters, no atomic updates
+ __pmPDUCntOut # pointer to diag counters, no atomic updates
+ inctrs # diag counters, no atomic updates
+ outctrs # diag counters, no atomic updates
+ maxsize # guarded by __pmLock_libpcp mutex
+p_error.o
+p_profile.o
+p_result.o
+profile.o
+p_text.o
+p_fetch.o
+p_instance.o
+p_lcontrol.o
+p_lrequest.o
+p_lstatus.o
+pmns.o
+ lineno # guarded by __pmLock_libpcp mutex
+ export # guarded by __pmLock_libpcp mutex
+ fin # guarded by __pmLock_libpcp mutex
+ first # guarded by __pmLock_libpcp mutex
+ fname # guarded by __pmLock_libpcp mutex
+ havePmLoadCall # guarded by __pmLock_libpcp mutex
+ last_mtim # guarded by __pmLock_libpcp mutex
+ last_pmns_location # guarded by __pmLock_libpcp mutex
+ linebuf # guarded by __pmLock_libpcp mutex
+ linep # guarded by __pmLock_libpcp mutex
+ lp # guarded by __pmLock_libpcp mutex
+ seen # guarded by __pmLock_libpcp mutex
+ seenpmid # guarded by __pmLock_libpcp mutex
+ tokbuf # guarded by __pmLock_libpcp mutex
+ tokpmid # guarded by __pmLock_libpcp mutex
+ useExtPMNS # guarded by __pmLock_libpcp mutex
+ repname # guarded by __pmLock_libpcp mutex
+ main_pmns # guarded by __pmLock_libpcp mutex
+ curr_pmns # guarded by __pmLock_libpcp mutex
+ locerr # no unsafe side-effects, see notes in pmns.c
+p_pmns.o
+p_profile.o
+p_result.o
+probe.o
+profile.o
+p_text.o
+rtime.o
+ ?wdays # const
+ ?months # const
+ ?ampm # const
+ int_tab # const struct {...} int_tab[] = {...}
+ ?numint # const
+ ?ampm # const (MinGW)
+ ?months # const (MinGW)
+ ?wdays # const (MinGW)
+ ?startend_relative_terms # const
+sortinst.o
+spec.o
+store.o
+stuffvalue.o
+tv.o
+tz.o
+ curzone # guarded by __pmLock_libpcp mutex
+ envtz # guarded by __pmLock_libpcp mutex
+ envtzlen # guarded by __pmLock_libpcp mutex
+ zone # guarded by __pmLock_libpcp mutex
+ nzone # guarded by __pmLock_libpcp mutex
+ savetz # guarded by __pmLock_libpcp mutex
+ savetzp # guarded by __pmLock_libpcp mutex
+ tzbuffer # guarded by __pmLock_libpcp mutex
+ ?wildabbr # const (MinGW)
+units.o
+ typename # const
+ abuf # pmAtomStr deprecated by pmAtomStr_r
+ tbuf # pmTypeStr deprecated by pmTypeStr_r
+ ubuf # pmUnitsStr deprecated by pmUnitsStr_r
+util.o
+ idbuf # pmIDStr deprecated by pmIDStr_r
+ indombuf # pmInDomStr deprecated by pmInDomStr_r
+ ebuf # pmEventFlagsStr deprecated by pmEventFlagsStr_r
+ nbuf # pmNumberStr deprecated by pmNumberStr_r
+ ?unknownVal # const, variable may be optimized away by gcc
+ debug_map # const
+ ?num_debug # const
+ pmState # no unsafe side-effects, see notes in util.c
+ pmProgname # no unsafe side-effects, see notes in util.c
+ filelog # guarded by __pmLock_libpcp mutex
+ nfilelog # guarded by __pmLock_libpcp mutex
+ dosyslog # guarded by __pmLock_libpcp mutex
+ done_exit # guarded by __pmLock_libpcp mutex
+ ferr # guarded by __pmLock_libpcp mutex
+ errtype # guarded by __pmLock_libpcp mutex
+ fptr # guarded by __pmLock_libpcp mutex
+ fname # guarded by __pmLock_libpcp mutex
+ msgsize # guarded by __pmLock_libpcp mutex
+ ?base # no unsafe side-effects, see notes in util.c
+ first # __pmEventType deprecated by __pmEventType_r
+ last # __pmEventType deprecated by __pmEventType_r
+ sum # __pmEventType deprecated by __pmEventType_r
+ ?bp # const
+ ?dp_h # const
+ ?dp_l # const
+?win32.o
+END # this is magic, DO NOT DELETE THIS LINE
+End-of-File
+
+for file in *.o
+do
+ case "$file"
+ in
+ '*.o')
+ echo "Error: no object files!! Need some drive-by make action?"
+ exit 1
+ ;;
+ esac
+
+ if grep "^?*$file\$" $tmp/ctl >/dev/null 2>&1
+ then
+ :
+ else
+ echo "$file: Error: object file not mentioned in control file"
+ touch $tmp/fail
+ fi
+done
+
+skip_file=false
+
+cat $tmp/ctl \
+| while read line
+do
+ if expr $line : '.*\.o$' >/dev/null # .o file
+ then
+ if [ -n "$obj" ]
+ then
+ if [ -s $tmp/out ]
+ then
+ # extras from the last object code file
+ sed <$tmp/out \
+ -e 's/^[^ ]* //' \
+ -e "s/^\(.\) \(.*\)/$obj: \1 \2 : Error: additional symbol/"
+ touch $tmp/fail
+ fi
+ fi
+ if [ "$line" != END ]
+ then
+ if [ -f $line ] # .o file rather than symbol name
+ then
+ # Need some nm special case logic ...
+ # for darwin
+ # + const data and text symbols both appear as "S", but
+ # the latter have .eh appended to the name
+ # + static arrays and some debug (?) symbols appear as
+ # "s", but the latter have _.NNN appended, or start
+ # with LC, or have .eh appended, or start with EH_
+ # + older versions insert get_pc_thunk symbols in all
+ # object files
+ # for MinGW
+ # + strip .bss and .data lines
+ # + strip .rdata and .eh_frame lines
+ # + external symbols tend to have "C" lines
+ # for FreeBSD
+ # + strip r __func__.NNN lines
+ #
+ skip_file=false
+ nm $line \
+ | sed -n >$tmp/out \
+ -e '/ S ___i686.get_pc_thunk.[bc]x/d' \
+ -e '/ [sS] .*\.eh$/d' \
+ -e '/ s .*_\.[0-9][0-9]*$/d' \
+ -e '/ s LC[0-9][0-9]*$/d' \
+ -e '/ s EH_/d' \
+ -e '/ b \.bss/d' \
+ -e '/ d \.data/d' \
+ -e '/ r \.rdata/d' \
+ -e '/ r \.eh_frame/d' \
+ -e '/ r __PRETTY_FUNCTION__.[0-9][0-9]*$/d' \
+ -e '/ r __func__.[0-9][0-9]*$/d' \
+ -e '/ r \.LC[0-9][0-9]*$/d' \
+ -e '/ C ___pmLogReads/d' \
+ -e '/ C ___pmNativeConfig/d' \
+ -e '/ C ___pmPDUCntIn/d' \
+ -e '/ C ___pmPDUCntOut/d' \
+ -e '/ C _pmProgname/d' \
+ -e '/ [dDbBCsSrR] /p'
+ obj=$line
+ else
+ case "$line"
+ in
+ secure*.o)
+ echo "$line: Info: security object file skipped, not configured"
+ skip_file=true
+ ;;
+ \?*)
+ skip_file=true
+ ;;
+ *)
+ echo "$line: Error: object file in control file but not found"
+ touch $tmp/fail
+ esac
+ fi
+ fi
+ continue
+ fi
+ $skip_file && continue
+ opt=`echo $line | sed -n -e 's/?.*/?/p'`
+ name=`echo $line | sed -e 's/?//'`
+ #debug# echo "obj=$obj type=$line opt=$opt"
+ #
+ # We accept the given symbol name with several decorations:
+ #
+ # - in any section type (bss data, whatever; as compilers can
+ # be fickle)
+ # - with or without a _ prefix
+ # - with or without a .NNN suffix (coming from function statics
+ # or optimizations)
+ #
+ sed <$tmp/out >$tmp/tmp \
+ -e "/ [dDbBCsSrR] $name\$/d" \
+ -e "/ [dDbBCsSrR] _$name\$/d" \
+ -e "/ [dDbBCsSrR] $name\.[0-9]*\$/d" \
+ -e "/ [dDbBCsSrR] _$name\.[0-9]*\$/d"
+ if cmp -s $tmp/out $tmp/tmp
+ then
+ if [ "$opt" != "?" ]
+ then
+ echo "$obj: $name: Warning: exceptioned symbol ($line) no longer present"
+ fi
+ else
+ mv $tmp/tmp $tmp/out
+ fi
+done
+
+[ ! -f $tmp/fail ] && sts=0 # success at last