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() + "; ")
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 = ""
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()))
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):
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)
-