Teach makeobjops.awk to accept PROLOG and EPILOG blocks before
METHOD and STATICMETHOD declarations; that code will be inserted into the dispatch function before and after the method call. Use this functionality and the TSLOG framework to record DEVICE_ATTACH and DEVICE_PROBE entry/exit timestamps.
This commit is contained in:
parent
95e678f96e
commit
a21a2da599
@ -39,6 +39,11 @@
|
||||
*/
|
||||
INTERFACE device;
|
||||
|
||||
# Needed for timestamping device probe/attach calls
|
||||
HEADER {
|
||||
#include <sys/tslog.h>
|
||||
}
|
||||
|
||||
#
|
||||
# Default implementations of some methods.
|
||||
#
|
||||
@ -142,6 +147,12 @@ CODE {
|
||||
* be returned to indicate the type of error
|
||||
* @see DEVICE_ATTACH(), pci_get_vendor(), pci_get_device()
|
||||
*/
|
||||
PROLOG {
|
||||
TSENTER2(device_get_name(dev));
|
||||
}
|
||||
EPILOG {
|
||||
TSEXIT2(device_get_name(dev));
|
||||
}
|
||||
METHOD int probe {
|
||||
device_t dev;
|
||||
};
|
||||
@ -199,6 +210,12 @@ STATICMETHOD void identify {
|
||||
* be returned to indicate the type of error
|
||||
* @see DEVICE_PROBE()
|
||||
*/
|
||||
PROLOG {
|
||||
TSENTER2(device_get_name(dev));
|
||||
}
|
||||
EPILOG {
|
||||
TSEXIT2(device_get_name(dev));
|
||||
}
|
||||
METHOD int attach {
|
||||
device_t dev;
|
||||
};
|
||||
|
@ -326,11 +326,19 @@ function handle_method (static, doc)
|
||||
}
|
||||
printh("{");
|
||||
printh("\tkobjop_t _m;");
|
||||
if (ret != "void")
|
||||
printh("\t" ret " rc;");
|
||||
if (!static)
|
||||
firstvar = "((kobj_t)" firstvar ")";
|
||||
if (prolog != "")
|
||||
printh(prolog);
|
||||
printh("\tKOBJOPLOOKUP(" firstvar "->ops," mname ");");
|
||||
retrn = (ret != "void") ? "return " : "";
|
||||
printh("\t" retrn "((" mname "_t *) _m)(" varname_list ");");
|
||||
rceq = (ret != "void") ? "rc = " : "";
|
||||
printh("\t" rceq "((" mname "_t *) _m)(" varname_list ");");
|
||||
if (epilog != "")
|
||||
printh(epilog);
|
||||
if (ret != "void")
|
||||
printh("\treturn (rc);");
|
||||
printh("}\n");
|
||||
}
|
||||
|
||||
@ -440,6 +448,8 @@ for (file_i = 0; file_i < num_files; file_i++) {
|
||||
lineno = 0;
|
||||
error = 0; # to signal clean up and gerror setting
|
||||
lastdoc = "";
|
||||
prolog = "";
|
||||
epilog = "";
|
||||
|
||||
while (!error && (getline < src) > 0) {
|
||||
lineno++;
|
||||
@ -473,10 +483,18 @@ for (file_i = 0; file_i < num_files; file_i++) {
|
||||
else if (/^METHOD/) {
|
||||
handle_method(0, lastdoc);
|
||||
lastdoc = "";
|
||||
prolog = "";
|
||||
epilog = "";
|
||||
} else if (/^STATICMETHOD/) {
|
||||
handle_method(1, lastdoc);
|
||||
lastdoc = "";
|
||||
} else {
|
||||
prolog = "";
|
||||
epilog = "";
|
||||
} else if (/^PROLOG[ ]*{$/)
|
||||
prolog = handle_code();
|
||||
else if (/^EPILOG[ ]*{$/)
|
||||
epilog = handle_code();
|
||||
else {
|
||||
debug($0);
|
||||
warnsrc("Invalid line encountered");
|
||||
error = 1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user