svn commit: r327428 - in head/sys: kern tools
Colin Percival
cperciva at FreeBSD.org
Sun Dec 31 09:23:20 UTC 2017
Author: cperciva
Date: Sun Dec 31 09:23:19 2017
New Revision: 327428
URL: https://svnweb.freebsd.org/changeset/base/327428
Log:
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.
Modified:
head/sys/kern/device_if.m
head/sys/tools/makeobjops.awk
Modified: head/sys/kern/device_if.m
==============================================================================
--- head/sys/kern/device_if.m Sun Dec 31 09:23:02 2017 (r327427)
+++ head/sys/kern/device_if.m Sun Dec 31 09:23:19 2017 (r327428)
@@ -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;
};
Modified: head/sys/tools/makeobjops.awk
==============================================================================
--- head/sys/tools/makeobjops.awk Sun Dec 31 09:23:02 2017 (r327427)
+++ head/sys/tools/makeobjops.awk Sun Dec 31 09:23:19 2017 (r327428)
@@ -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;
More information about the svn-src-all
mailing list