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;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to