summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStan Cox <scox@redhat.com>2009-09-11 15:01:48 -0400
committerStan Cox <scox@redhat.com>2009-09-11 15:01:48 -0400
commit4f46087f18da349f124d7fd28721cd274b7176d1 (patch)
tree3ee1ba2e1fa02efb9fb237a92cf4ccf11a1592d0
parentf47016f39fc445db01edafdf4a343406f6165adb (diff)
downloadsystemtap-steved-4f46087f18da349f124d7fd28721cd274b7176d1.tar.gz
systemtap-steved-4f46087f18da349f124d7fd28721cd274b7176d1.tar.xz
systemtap-steved-4f46087f18da349f124d7fd28721cd274b7176d1.zip
Add semaphores for use with the forthcoming sdt marker checks.
dtrace.in (semaphore_def_append): New. (generate): Call it. (semaphore_def_write): New. (main): Call it.
-rwxr-xr-xdtrace.in26
1 files changed, 24 insertions, 2 deletions
diff --git a/dtrace.in b/dtrace.in
index 96a10b3a..98783604 100755
--- a/dtrace.in
+++ b/dtrace.in
@@ -17,9 +17,17 @@ from subprocess import call
from tempfile import mkstemp
class provider:
+ semaphores_def = "\n"
+ # is the type a basic scalar type?
+ def basic_type(self, arg):
+ basic_types = [ "int","int*","long","long*","short","short int","unsigned long","char","char*","float","double" ]
+ split_arg = arg.rsplit(None,1)
+ return (split_arg[0].strip() in basic_types) & (arg.find("[") == -1)
def typedef_append(self, typedefs,this_probe,arg,c):
if (add_typedefs):
split_arg = arg.rsplit(None,1)
+ if (self.basic_type(arg)):
+ return typedefs
type_name = " %s_arg%d" % (this_probe.replace("__","_"),c)
if (len(split_arg) > 1):
typedefs += ("typedef " + arg.replace(" " + split_arg[1].split("[")[0].lstrip("*"),type_name).strip() + "; ")
@@ -28,11 +36,16 @@ class provider:
typedefs += ("typedef " + arg.strip() + type_name + "; ")
typedefs += (type_name + type_name + "_v;\n")
return typedefs
+ def semaphore_def_append(self, this_probe):
+ self.semaphores_def += "__extension__ long %s_semaphore __attribute__ ((unused)) __attribute__ ((section (\".probes\")));\n" % (this_probe)
+ def semaphore_def_write(self, file):
+ file.write(self.semaphores_def)
def generate(self, provider, header, add_typedefs):
have_provider = False
self.f = open(provider)
self.h = open(header,mode='w')
self.h.write("/* Generated by the Systemtap dtrace wrapper */\n")
+ self.h.write("\n#define STAP_HAS_SEMAPHORES 1\n\n")
self.h.write("\n#include <sys/sdt.h>\n\n")
in_comment = False
typedefs = ""
@@ -64,6 +77,7 @@ class provider:
arg = ""
i = 0
c = 0
+ self.semaphore_def_append (this_probe)
while (i < len(args)):
if (args[i:i+1] == ","):
args_string = ('%s %s,' % (args_string, arg.strip()))
@@ -91,7 +105,8 @@ class provider:
stap_str = stap_str + ",arg%s" % (i);
i += 1
self.h.write ('/* %s (%s) */\n' % (this_probe_canon,args_string))
- self.h.write ('#define %s_ENABLED() 1\n' % this_probe_canon)
+ self.h.write ('#define %s_ENABLED() %s_semaphore\n' % (this_probe_canon,this_probe))
+ self.h.write ("__extension__ extern long %s_semaphore __attribute__ ((unused)) __attribute__ ((section (\".probes\")));\n" % (this_probe))
self.h.write (define_str + ") \\\n")
self.h.write (stap_str + ")\n\n")
elif (line.find("}") != -1 and have_provider):
@@ -187,12 +202,19 @@ if (build_header):
providers.generate(s_filename, filename + h_ext, add_typedefs)
elif (build_source):
(basename,ext) = os.path.splitext(s_filename)
+
+ # create for semaphore_def_write
+ providers = provider()
+ (d,fn) = mkstemp(suffix=".h")
+ providers.generate(s_filename, fn, add_typedefs)
+ os.remove(fn)
+
(d,fn) = mkstemp(suffix=".c")
f = open(fn,mode='w')
f.write("static __dtrace () {}\n")
+ providers.semaphore_def_write(f)
f.close()
call(["gcc", "-fPIC", "-I.", "-I@prefix@/include", "-g", "-c", fn, "-o", filename + ".o"], shell=False)
os.remove(fn)
if (use_cpp):
os.remove(s_filename)
-