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:
Colin Percival 2017-12-31 09:23:19 +00:00
parent 95e678f96e
commit a21a2da599
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=327428
2 changed files with 38 additions and 3 deletions

View File

@ -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;
};

View File

@ -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;