diff options
author | Stan Cox <scox@redhat.com> | 2009-09-11 15:01:48 -0400 |
---|---|---|
committer | Stan Cox <scox@redhat.com> | 2009-09-11 15:01:48 -0400 |
commit | 4f46087f18da349f124d7fd28721cd274b7176d1 (patch) | |
tree | 3ee1ba2e1fa02efb9fb237a92cf4ccf11a1592d0 | |
parent | f47016f39fc445db01edafdf4a343406f6165adb (diff) | |
download | systemtap-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-x | dtrace.in | 26 |
1 files changed, 24 insertions, 2 deletions
@@ -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) - |