]> sourceware.org Git - systemtap.git/commitdiff
Add semaphores for use with the forthcoming sdt marker checks.
authorStan Cox <scox@redhat.com>
Fri, 11 Sep 2009 19:01:48 +0000 (15:01 -0400)
committerStan Cox <scox@redhat.com>
Fri, 11 Sep 2009 19:01:48 +0000 (15:01 -0400)
dtrace.in (semaphore_def_append): New.
(generate): Call it.
(semaphore_def_write): New.
(main): Call it.

dtrace.in

index 96a10b3acfaec9e03cbf8d13dbb53318a180ecc7..987836048e8a2a28e5cc5040c4d3fb67e5c386eb 100755 (executable)
--- 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)
-
This page took 0.025362 seconds and 5 git commands to generate.