/src/utilities/thread_wrappers.awk

https://github.com/hypre-space/hypre · AWK · 165 lines · 139 code · 10 blank · 16 comment · 15 complexity · c526f70cf7e99acd6536e950d399b3a6 MD5 · raw file

  1. # Copyright 1998-2019 Lawrence Livermore National Security, LLC and other
  2. # HYPRE Project Developers. See the top-level COPYRIGHT file for details.
  3. #
  4. # SPDX-License-Identifier: (Apache-2.0 OR MIT)
  5. #===========================================================================
  6. # To use, do:
  7. #
  8. # /usr/xpg4/bin/awk -f {this file} < {input file} > {output file}
  9. #
  10. #===========================================================================
  11. BEGIN {
  12. prefix = "HYPRE_"
  13. }
  14. / P\(\(/ {
  15. ####################################################
  16. # parse prototype and define various variables
  17. ####################################################
  18. split($0, b, "[\ \t]*P\(\([\ \t]*");
  19. routine_string = b[1];
  20. m = match(b[2], "[\ \t]*));");
  21. arg_string = substr(b[2], 1, m-1);
  22. n = split(routine_string, a, "[^A-Za-z_0-9]");
  23. routine = a[n];
  24. m = match(routine_string, routine);
  25. routine_type = substr(routine_string, 1, m-1);
  26. routine_args = routine"Args";
  27. routine_push = routine"Push";
  28. routine_vptr = routine"VoidPtr";
  29. num_args = split(arg_string, arg_array, "[\ \t]*,[\ \t]*");
  30. for (i = 1; i <= num_args; i++)
  31. {
  32. n = split(arg_array[i], a, "[^A-Za-z_0-9]");
  33. arg[i] = a[n];
  34. m = match(arg_array[i], arg[i]);
  35. arg_type[i] = substr(arg_array[i], 1, m-1);
  36. }
  37. ####################################################
  38. # write the wrapper routine for this prototype
  39. ####################################################
  40. print "";
  41. print "/*----------------------------------------------------------------";
  42. print " * "routine" thread wrappers";
  43. print " *----------------------------------------------------------------*/";
  44. print "";
  45. print "typedef struct {";
  46. for (i = 1; i <= num_args; i++)
  47. {
  48. m = match(arg_type[i], "[^A-Za-z_0-9]");
  49. if (arg_type[i] ~ prefix)
  50. {
  51. base_type = substr(arg_type[i], 1, m-1);
  52. print " "base_type"Array *" arg[i]";";
  53. }
  54. else
  55. {
  56. print " "arg_type[i] arg[i]";";
  57. }
  58. }
  59. print " "routine_type" returnvalue[hypre_MAX_THREADS];";
  60. print "} "routine_args";";
  61. print "";
  62. print "void";
  63. print routine_vptr"( void *argptr )";
  64. print "{";
  65. print " int threadid = hypre_GetThreadID();";
  66. print "";
  67. print " "routine_args" *localargs =";
  68. print " ("routine_args" *) argptr;";
  69. print "";
  70. print " (localargs -> returnvalue[threadid]) =";
  71. print " "routine"(";
  72. endline = ",";
  73. for (i = 1; i <= num_args; i++)
  74. {
  75. if (i == num_args)
  76. {
  77. endline = " );";
  78. }
  79. m = match(arg_type[i], "[^A-Za-z_0-9]");
  80. if (arg_type[i] ~ prefix)
  81. {
  82. base_pointer = substr(arg_type[i], m);
  83. if (base_pointer ~ "\*")
  84. {
  85. print " &(*(localargs -> "arg[i]"))[threadid]"endline;
  86. }
  87. else
  88. {
  89. print " (*(localargs -> "arg[i]"))[threadid]"endline;
  90. }
  91. }
  92. else
  93. {
  94. print " localargs -> "arg[i] endline;
  95. }
  96. }
  97. print "}";
  98. print "";
  99. print routine_type;
  100. print routine_push"(";
  101. endline = ",";
  102. for (i = 1; i <= num_args; i++)
  103. {
  104. if (i == num_args)
  105. {
  106. endline = " )";
  107. }
  108. m = match(arg_type[i], "[^A-Za-z_0-9]");
  109. if (arg_type[i] ~ prefix)
  110. {
  111. base_type = substr(arg_type[i], 1, m-1);
  112. base_pointer = substr(arg_type[i], m);
  113. if (base_pointer ~ "\*")
  114. {
  115. print " "base_type"Array *" arg[i] endline;
  116. }
  117. else
  118. {
  119. print " "base_type"Array "arg[i] endline;
  120. }
  121. }
  122. else
  123. {
  124. print " "arg_type[i] arg[i] endline;
  125. }
  126. }
  127. print "{";
  128. print " "routine_args" pushargs;";
  129. print " int i;";
  130. print " "routine_type" returnvalue;";
  131. print "";
  132. for (i = 1; i <= num_args; i++)
  133. {
  134. m = match(arg_type[i], "[^A-Za-z_0-9]");
  135. if (arg_type[i] ~ prefix)
  136. {
  137. base_type = substr(arg_type[i], 1, m-1);
  138. base_pointer = substr(arg_type[i], m);
  139. print " pushargs."arg[i]" = ("base_type"Array *)"arg[i]";";
  140. }
  141. else
  142. {
  143. print " pushargs."arg[i]" = "arg[i]";";
  144. }
  145. }
  146. print " for (i = 0; i < hypre_NumThreads; i++)";
  147. print " hypre_work_put( "routine_vptr", (void *)&pushargs );";
  148. print "";
  149. print " hypre_work_wait();";
  150. print "";
  151. print " returnvalue = pushargs.returnvalue[0];";
  152. print "";
  153. print " return returnvalue;";
  154. print "}";
  155. }