ARGOBOTS  1.1
info.c
Go to the documentation of this file.
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  * See COPYRIGHT in top-level directory.
4  */
5 
6 #include "abti.h"
7 
9  ABTI_pool *p_pool);
11  FILE *fp, double timeout, void (*cb_func)(ABT_bool, void *), void *arg);
12 
206 int ABT_info_query_config(ABT_info_query_kind query_kind, void *val)
207 {
208 #ifndef ABT_CONFIG_ENABLE_VER_20_API
209  /* Argobots 1.x always requires an init check. */
210  ABTI_SETUP_GLOBAL(NULL);
211 #endif
212  switch (query_kind) {
214  ABTI_global *p_global;
215  ABTI_SETUP_GLOBAL(&p_global);
216  *((ABT_bool *)val) = p_global->use_debug;
217  } break;
219 #ifdef ABT_CONFIG_PRINT_ABT_ERRNO
220  *((ABT_bool *)val) = ABT_TRUE;
221 #else
222  *((ABT_bool *)val) = ABT_FALSE;
223 #endif
224  break;
226  ABTI_global *p_global;
227  ABTI_SETUP_GLOBAL(&p_global);
228  *((ABT_bool *)val) = p_global->use_logging;
229  } break;
231 #ifdef HAVE_VALGRIND_SUPPORT
232  *((ABT_bool *)val) = ABT_TRUE;
233 #else
234  *((ABT_bool *)val) = ABT_FALSE;
235 #endif
236  break;
238 #ifndef ABT_CONFIG_DISABLE_ERROR_CHECK
239  *((ABT_bool *)val) = ABT_TRUE;
240 #else
241  *((ABT_bool *)val) = ABT_FALSE;
242 #endif
243  break;
245  *((ABT_bool *)val) = ABT_FALSE;
246  break;
248  *((ABT_bool *)val) = ABT_FALSE;
249  break;
251 #if !defined(ABTD_FCONTEXT_PRESERVE_FPU) && defined(ABT_CONFIG_USE_FCONTEXT)
252  *((ABT_bool *)val) = ABT_FALSE;
253 #else
254  /* If ucontext is used, FPU is preserved. */
255  *((ABT_bool *)val) = ABT_TRUE;
256 #endif
257  break;
259 #ifndef ABT_CONFIG_DISABLE_THREAD_CANCEL
260  *((ABT_bool *)val) = ABT_TRUE;
261 #else
262  *((ABT_bool *)val) = ABT_FALSE;
263 #endif
264  break;
266 #ifndef ABT_CONFIG_DISABLE_TASK_CANCEL
267  *((ABT_bool *)val) = ABT_TRUE;
268 #else
269  *((ABT_bool *)val) = ABT_FALSE;
270 #endif
271  break;
273 #ifndef ABT_CONFIG_DISABLE_MIGRATION
274  *((ABT_bool *)val) = ABT_TRUE;
275 #else
276  *((ABT_bool *)val) = ABT_FALSE;
277 #endif
278  break;
280  *((ABT_bool *)val) = ABT_TRUE;
281  break;
283 #ifndef ABT_CONFIG_DISABLE_EXT_THREAD
284  *((ABT_bool *)val) = ABT_TRUE;
285 #else
286  *((ABT_bool *)val) = ABT_FALSE;
287 #endif
288  break;
290 #ifdef ABT_CONFIG_USE_SCHED_SLEEP
291  *((ABT_bool *)val) = ABT_TRUE;
292 #else
293  *((ABT_bool *)val) = ABT_FALSE;
294 #endif
295  break;
297  ABTI_global *p_global;
298  ABTI_SETUP_GLOBAL(&p_global);
299  *((ABT_bool *)val) = p_global->print_config;
300  } break;
302  ABTI_global *p_global;
303  ABTI_SETUP_GLOBAL(&p_global);
304  *((ABT_bool *)val) = p_global->set_affinity;
305  } break;
307  ABTI_global *p_global;
308  ABTI_SETUP_GLOBAL(&p_global);
309  *((unsigned int *)val) = p_global->max_xstreams;
310  } break;
312  ABTI_global *p_global;
313  ABTI_SETUP_GLOBAL(&p_global);
314  *((size_t *)val) = p_global->thread_stacksize;
315  } break;
317  ABTI_global *p_global;
318  ABTI_SETUP_GLOBAL(&p_global);
319  *((size_t *)val) = p_global->sched_stacksize;
320  } break;
322  ABTI_global *p_global;
323  ABTI_SETUP_GLOBAL(&p_global);
324  *((uint64_t *)val) = p_global->sched_event_freq;
325  } break;
327  ABTI_global *p_global;
328  ABTI_SETUP_GLOBAL(&p_global);
329  *((uint64_t *)val) = p_global->sched_sleep_nsec;
330  } break;
332 #ifndef ABT_CONFIG_DISABLE_TOOL_INTERFACE
333  *((ABT_bool *)val) = ABT_TRUE;
334 #else
335  *((ABT_bool *)val) = ABT_FALSE;
336 #endif
337  break;
339 #ifdef ABT_CONFIG_USE_FCONTEXT
340  *((ABT_bool *)val) = ABT_TRUE;
341 #else
342  *((ABT_bool *)val) = ABT_FALSE;
343 #endif
344  break;
346 #if ABT_CONFIG_THREAD_TYPE == ABT_THREAD_TYPE_DYNAMIC_PROMOTION
347  *((ABT_bool *)val) = ABT_TRUE;
348 #else
349  *((ABT_bool *)val) = ABT_FALSE;
350 #endif
351  break;
353 #ifdef ABT_CONFIG_ENABLE_STACK_UNWIND
354  *((ABT_bool *)val) = ABT_TRUE;
355 #else
356  *((ABT_bool *)val) = ABT_FALSE;
357 #endif
358  break;
360 #if ABT_CONFIG_STACK_CHECK_TYPE == ABTI_STACK_CHECK_TYPE_CANARY
361  *((int *)val) = 1;
362 #else
363  *((int *)val) = 0;
364 #endif
365  break;
367 #if ABT_CONFIG_ACTIVE_WAIT_POLICY
368  *((int *)val) = 1;
369 #else
370  *((int *)val) = 0;
371 #endif
372  break;
373  default:
375  }
376  return ABT_SUCCESS;
377 }
378 
409 {
410  ABTI_global *p_global;
411 #ifndef ABT_CONFIG_ENABLE_VER_20_API
412  /* Argobots 1.x always requires an init check. */
413  ABTI_SETUP_GLOBAL(&p_global);
414 #else
415  p_global = ABTI_global_get_global_or_null();
416  if (!p_global) {
417  fprintf(fp, "Argobots is not initialized.\n");
418  fflush(fp);
419  return ABT_SUCCESS;
420  }
421 #endif
422  ABTI_info_print_config(p_global, fp);
423  return ABT_SUCCESS;
424 }
425 
456 {
457  ABTI_global *p_global;
458 #ifndef ABT_CONFIG_ENABLE_VER_20_API
459  /* Argobots 1.x always requires an init check. */
460  ABTI_SETUP_GLOBAL(&p_global);
461 #else
462  p_global = ABTI_global_get_global_or_null();
463  if (!p_global) {
464  fprintf(fp, "Argobots is not initialized.\n");
465  fflush(fp);
466  return ABT_SUCCESS;
467  }
468 #endif
469 
471 
472  fprintf(fp, "# of created ESs: %d\n", p_global->num_xstreams);
473 
474  ABTI_xstream *p_xstream = p_global->p_xstream_head;
475  while (p_xstream) {
476  ABTI_xstream_print(p_xstream, fp, 0, ABT_FALSE);
477  p_xstream = p_xstream->p_next;
478  }
479 
481 
482  fflush(fp);
483  return ABT_SUCCESS;
484 }
485 
516 int ABT_info_print_xstream(FILE *fp, ABT_xstream xstream)
517 {
518  ABTI_xstream *p_xstream = ABTI_xstream_get_ptr(xstream);
519 #ifndef ABT_CONFIG_ENABLE_VER_20_API
520  /* Argobots 1.x requires a NULL-handle check. */
521  ABTI_CHECK_NULL_XSTREAM_PTR(p_xstream);
522 #endif
523  ABTI_xstream_print(p_xstream, fp, 0, ABT_FALSE);
524  return ABT_SUCCESS;
525 }
526 
557 int ABT_info_print_sched(FILE *fp, ABT_sched sched)
558 {
559  ABTI_sched *p_sched = ABTI_sched_get_ptr(sched);
560 #ifndef ABT_CONFIG_ENABLE_VER_20_API
561  /* Argobots 1.x requires a NULL-handle check. */
562  ABTI_CHECK_NULL_SCHED_PTR(p_sched);
563 #endif
564  ABTI_sched_print(p_sched, fp, 0, ABT_TRUE);
565  return ABT_SUCCESS;
566 }
567 
598 int ABT_info_print_pool(FILE *fp, ABT_pool pool)
599 {
600  ABTI_pool *p_pool = ABTI_pool_get_ptr(pool);
601 #ifndef ABT_CONFIG_ENABLE_VER_20_API
602  /* Argobots 1.x requires a NULL-handle check. */
603  ABTI_CHECK_NULL_POOL_PTR(p_pool);
604 #endif
605  ABTI_pool_print(p_pool, fp, 0);
606  return ABT_SUCCESS;
607 }
608 
643 int ABT_info_print_thread(FILE *fp, ABT_thread thread)
644 {
645  ABTI_thread *p_thread = ABTI_thread_get_ptr(thread);
646 #ifndef ABT_CONFIG_ENABLE_VER_20_API
647  /* Argobots 1.x requires a NULL-handle check. */
648  ABTI_CHECK_NULL_THREAD_PTR(p_thread);
649 #endif
650  ABTI_thread_print(p_thread, fp, 0);
651  return ABT_SUCCESS;
652 }
653 
685 {
687 #ifndef ABT_CONFIG_ENABLE_VER_20_API
688  /* Argobots 1.x requires a NULL-handle check. */
690 #endif
691  ABTI_thread_attr_print(p_attr, fp, 0);
692  return ABT_SUCCESS;
693 }
694 
730 int ABT_info_print_task(FILE *fp, ABT_task task)
731 {
732  ABTI_thread *p_thread = ABTI_thread_get_ptr(task);
733 #ifndef ABT_CONFIG_ENABLE_VER_20_API
734  /* Argobots 1.x requires a NULL-handle check. */
735  ABTI_CHECK_NULL_TASK_PTR(p_thread);
736 #endif
737  ABTI_thread_print(p_thread, fp, 0);
738  return ABT_SUCCESS;
739 }
740 
776 int ABT_info_print_thread_stack(FILE *fp, ABT_thread thread)
777 {
778  ABTI_thread *p_thread = ABTI_thread_get_ptr(thread);
779 #ifndef ABT_CONFIG_ENABLE_VER_20_API
780  /* Argobots 1.x requires a NULL-handle check. */
781  ABTI_CHECK_NULL_THREAD_PTR(p_thread);
782 #endif
783  if (!p_thread) {
784  fprintf(fp, "no stack\n");
785  fflush(0);
786  } else {
787  ABTI_ythread *p_ythread;
788  if (p_thread->type & ABTI_THREAD_TYPE_YIELDABLE) {
789  p_ythread = ABTI_thread_get_ythread(p_thread);
790  ABTI_ythread_print_stack(p_ythread, fp);
791  } else {
792  fprintf(fp, "no stack\n");
793  fflush(0);
794  }
795  }
796  return ABT_SUCCESS;
797 }
798 
832 {
833  ABTI_pool *p_pool = ABTI_pool_get_ptr(pool);
834 #ifndef ABT_CONFIG_ENABLE_VER_20_API
835  /* Argobots 1.x requires a NULL-handle check. */
836  ABTI_CHECK_NULL_POOL_PTR(p_pool);
837 #endif
838  int abt_errno = info_print_thread_stacks_in_pool(fp, p_pool);
839  ABTI_CHECK_ERROR(abt_errno);
840  return ABT_SUCCESS;
841 }
842 
907 int ABT_info_trigger_print_all_thread_stacks(FILE *fp, double timeout,
908  void (*cb_func)(ABT_bool, void *),
909  void *arg)
910 {
911  info_trigger_print_all_thread_stacks(fp, timeout, cb_func, arg);
912  return ABT_SUCCESS;
913 }
914 
915 /*****************************************************************************/
916 /* Private APIs */
917 /*****************************************************************************/
918 
920  FILE *fp);
921 
922 #define PRINT_STACK_FLAG_UNSET 0
923 #define PRINT_STACK_FLAG_INITIALIZE 1
924 #define PRINT_STACK_FLAG_WAIT 2
925 #define PRINT_STACK_FLAG_FINALIZE 3
926 
929 static FILE *print_stack_fp = NULL;
930 static double print_stack_timeout = 0.0;
931 static void (*print_cb_func)(ABT_bool, void *) = NULL;
932 static void *print_arg = NULL;
935 
937 {
940  return;
941 
942  /* Wait for the other execution streams using a barrier mechanism. */
943  int self_value = ABTD_atomic_fetch_add_int(&print_stack_barrier, 1);
944  if (self_value == 0) {
945  ABTI_global *p_global = ABTI_global_get_global();
946  /* This ES becomes the main ES. */
947  double start_time = ABTI_get_wtime();
948  ABT_bool force_print = ABT_FALSE;
949 
950  /* xstreams_lock is acquired to avoid dynamic ES creation while
951  * printing data. */
953  while (1) {
955  p_global->num_xstreams) {
956  break;
957  }
958  if (print_stack_timeout >= 0.0 &&
959  (ABTI_get_wtime() - start_time) >= print_stack_timeout) {
960  force_print = ABT_TRUE;
961  break;
962  }
966  }
967  /* All the available ESs are (supposed to be) stopped. We *assume* that
968  * no ES is calling and will call Argobots functions except this
969  * function while printing stack information. */
970  if (force_print) {
971  fprintf(print_stack_fp,
972  "ABT_info_trigger_print_all_thread_stacks: "
973  "timeout (only %d ESs stop)\n",
975  }
976  int abt_errno = print_all_thread_stacks(p_global, print_stack_fp);
977  if (ABTI_IS_ERROR_CHECK_ENABLED && abt_errno != ABT_SUCCESS) {
978  fprintf(print_stack_fp, "ABT_info_trigger_print_all_thread_stacks: "
979  "failed because of an internal error.\n");
980  }
981  fflush(print_stack_fp);
982  /* Release the lock that protects ES data. */
984  if (print_cb_func)
985  print_cb_func(force_print, print_arg);
986  /* Update print_stack_flag to 3. */
989  } else {
990  /* Wait for the main ES's work. */
994  }
997 
998  /* Decrement the barrier value. */
999  int dec_value = ABTD_atomic_fetch_sub_int(&print_stack_barrier, 1);
1000  if (dec_value == 0) {
1001  /* The last execution stream resets the flag. */
1004  }
1005 }
1006 
1007 void ABTI_info_print_config(ABTI_global *p_global, FILE *fp)
1008 {
1009  fprintf(fp, "Argobots Configuration:\n");
1010  fprintf(fp, " - version: " ABT_VERSION "\n");
1011  fprintf(fp, " - # of cores: %d\n", p_global->num_cores);
1012  fprintf(fp, " - cache line size: %u B\n", ABT_CONFIG_STATIC_CACHELINE_SIZE);
1013  fprintf(fp, " - huge page size: %zu B\n", p_global->huge_page_size);
1014  fprintf(fp, " - max. # of ESs: %d\n", p_global->max_xstreams);
1015  fprintf(fp, " - cur. # of ESs: %d\n", p_global->num_xstreams);
1016  fprintf(fp, " - ES affinity: %s\n",
1017  (p_global->set_affinity == ABT_TRUE) ? "on" : "off");
1018  fprintf(fp, " - logging: %s\n",
1019  (p_global->use_logging == ABT_TRUE) ? "on" : "off");
1020  fprintf(fp, " - debug output: %s\n",
1021  (p_global->use_debug == ABT_TRUE) ? "on" : "off");
1022  fprintf(fp, " - print errno: "
1023 #ifdef ABT_CONFIG_PRINT_ABT_ERRNO
1024  "on"
1025 #else
1026  "off"
1027 #endif
1028  "\n");
1029  fprintf(fp, " - valgrind support: "
1030 #ifdef HAVE_VALGRIND_SUPPORT
1031  "yes"
1032 #else
1033  "no"
1034 #endif
1035  "\n");
1036  fprintf(fp, " - thread cancellation: "
1037 #ifndef ABT_CONFIG_DISABLE_THREAD_CANCEL
1038  "enabled"
1039 #else
1040  "disabled"
1041 #endif
1042  "\n");
1043  fprintf(fp, " - task cancellation: "
1044 #ifndef ABT_CONFIG_DISABLE_TASK_CANCEL
1045  "enabled"
1046 #else
1047  "disabled"
1048 #endif
1049  "\n");
1050  fprintf(fp, " - thread migration: "
1051 #ifndef ABT_CONFIG_DISABLE_MIGRATION
1052  "enabled"
1053 #else
1054  "disabled"
1055 #endif
1056  "\n");
1057  fprintf(fp, " - external thread: "
1058 #ifndef ABT_CONFIG_DISABLE_EXT_THREAD
1059  "enabled"
1060 #else
1061  "disabled"
1062 #endif
1063  "\n");
1064  fprintf(fp, " - error check: "
1065 #ifndef ABT_CONFIG_DISABLE_ERROR_CHECK
1066  "enabled"
1067 #else
1068  "disable"
1069 #endif
1070  "\n");
1071  fprintf(fp, " - tool interface: "
1073  "yes"
1074 #else
1075  "no"
1076 #endif
1077  "\n");
1078  fprintf(fp, " - wait policy: "
1079 #ifdef ABT_CONFIG_ACTIVE_WAIT_POLICY
1080  "active"
1081 #else
1082  "passive"
1083 #endif
1084  "\n");
1085  fprintf(fp, " - context-switch: "
1087  "fcontext"
1090  " (dynamic-promotion)"
1092  !defined(ABTD_FCONTEXT_PRESERVE_FPU)
1093  " (dynamic-promotion, no FPU save)"
1095  !defined(ABTD_FCONTEXT_PRESERVE_FPU)
1096  " (no FPU save)"
1097 #endif /* ABT_CONFIG_THREAD_TYPE, ABTD_FCONTEXT_PRESERVE_FPU */
1098 
1099 #else /* ABT_CONFIG_USE_FCONTEXT */
1100  "ucontext"
1101 #endif /* !ABT_CONFIG_USE_FCONTEXT */
1102  "\n");
1103 
1104  fprintf(fp, " - key table entries: %" PRIu32 "\n",
1105  p_global->key_table_size);
1106  fprintf(fp, " - default ULT stack size: %zu KB\n",
1107  p_global->thread_stacksize / 1024);
1108  fprintf(fp, " - default scheduler stack size: %zu KB\n",
1109  p_global->sched_stacksize / 1024);
1110  fprintf(fp, " - default scheduler event check frequency: %u\n",
1111  p_global->sched_event_freq);
1112  fprintf(fp, " - default scheduler sleep: "
1113 #ifdef ABT_CONFIG_USE_SCHED_SLEEP
1114  "on"
1115 #else
1116  "off"
1117 #endif
1118  "\n");
1119  fprintf(fp, " - default scheduler sleep duration : %" PRIu64 " [ns]\n",
1120  p_global->sched_sleep_nsec);
1121 
1122  fprintf(fp, " - timer function: "
1123 #if defined(ABT_CONFIG_USE_CLOCK_GETTIME)
1124  "clock_gettime"
1125 #elif defined(ABT_CONFIG_USE_MACH_ABSOLUTE_TIME)
1126  "mach_absolute_time"
1127 #elif defined(ABT_CONFIG_USE_GETTIMEOFDAY)
1128  "gettimeofday"
1129 #endif
1130  "\n");
1131 
1132 #ifdef ABT_CONFIG_USE_MEM_POOL
1133  fprintf(fp, "Memory Pool:\n");
1134  fprintf(fp, " - page size for allocation: %zu KB\n",
1135  p_global->mem_page_size / 1024);
1136  fprintf(fp, " - stack page size: %zu KB\n", p_global->mem_sp_size / 1024);
1137  fprintf(fp, " - max. # of stacks per ES: %u\n", p_global->mem_max_stacks);
1138  fprintf(fp, " - max. # of descs per ES: %u\n", p_global->mem_max_descs);
1139  switch (p_global->mem_lp_alloc) {
1140  case ABTI_MEM_LP_MALLOC:
1141  fprintf(fp, " - large page allocation: malloc\n");
1142  break;
1143  case ABTI_MEM_LP_MMAP_RP:
1144  fprintf(fp, " - large page allocation: mmap regular pages\n");
1145  break;
1147  fprintf(fp, " - large page allocation: mmap huge pages + "
1148  "regular pages\n");
1149  break;
1151  fprintf(fp, " - large page allocation: mmap huge pages + THPs\n");
1152  break;
1153  case ABTI_MEM_LP_THP:
1154  fprintf(fp, " - large page allocation: THPs\n");
1155  break;
1156  }
1157 #endif /* ABT_CONFIG_USE_MEM_POOL */
1158 
1159  fflush(fp);
1160 }
1161 
1162 /*****************************************************************************/
1163 /* Internal static functions */
1164 /*****************************************************************************/
1165 
1166 struct info_print_unit_arg_t {
1167  FILE *fp;
1168 };
1171  ABT_pool *pools;
1172  size_t num;
1173  size_t len;
1174 };
1176 static void info_print_unit(void *arg, ABT_unit unit)
1177 {
1178  /* This function may not have any side effect on unit because it is passed
1179  * to p_print_all. */
1180  struct info_print_unit_arg_t *p_arg;
1181  p_arg = (struct info_print_unit_arg_t *)arg;
1182  FILE *fp = p_arg->fp;
1183  ABTI_thread *p_thread =
1185 
1186  if (!p_thread) {
1187  fprintf(fp, "=== unknown (%p) ===\n", (void *)unit);
1188  } else if (p_thread->type & ABTI_THREAD_TYPE_YIELDABLE) {
1189  fprintf(fp, "=== ULT (%p) ===\n", (void *)unit);
1190  ABTI_ythread *p_ythread = ABTI_thread_get_ythread(p_thread);
1191  ABT_unit_id thread_id = ABTI_thread_get_id(&p_ythread->thread);
1192  fprintf(fp,
1193  "id : %" PRIu64 "\n"
1194  "ctx : %p\n",
1195  (uint64_t)thread_id, (void *)&p_ythread->ctx);
1196  ABTI_ythread_print_stack(p_ythread, fp);
1197  } else {
1198  fprintf(fp, "=== tasklet (%p) ===\n", (void *)unit);
1199  }
1200 }
1201 
1203  ABTI_pool *p_pool)
1204 {
1205  if (p_pool == NULL) {
1206  fprintf(fp, "== NULL pool ==\n");
1207  fflush(fp);
1208  return ABT_SUCCESS;
1209  }
1211 
1212  ABT_pool pool = ABTI_pool_get_handle(p_pool);
1213 
1214  fprintf(fp, "== pool (%p) ==\n", (void *)p_pool);
1215  struct info_print_unit_arg_t arg;
1216  arg.fp = fp;
1217  p_pool->p_print_all(pool, &arg, info_print_unit);
1218  fflush(fp);
1219  return ABT_SUCCESS;
1220 }
1221 
1222 ABTU_ret_err static inline int
1224 {
1225  size_t default_len = 16;
1226  int abt_errno =
1227  ABTU_malloc(sizeof(ABT_pool) * default_len, (void **)&p_set->pools);
1228  ABTI_CHECK_ERROR(abt_errno);
1229  p_set->num = 0;
1230  p_set->len = default_len;
1231  return ABT_SUCCESS;
1232 }
1233 
1234 static inline void info_finalize_pool_set(struct info_pool_set_t *p_set)
1235 {
1236  ABTU_free(p_set->pools);
1238 
1239 ABTU_ret_err static inline int info_add_pool_set(ABT_pool pool,
1240  struct info_pool_set_t *p_set)
1241 {
1242  size_t i;
1243  for (i = 0; i < p_set->num; i++) {
1244  if (p_set->pools[i] == pool)
1245  return ABT_SUCCESS;
1246  }
1247  /* Add pool to p_set. */
1248  if (p_set->num == p_set->len) {
1249  size_t new_len = p_set->len * 2;
1250  int abt_errno =
1251  ABTU_realloc(sizeof(ABT_pool) * p_set->len,
1252  sizeof(ABT_pool) * new_len, (void **)&p_set->pools);
1253  ABTI_CHECK_ERROR(abt_errno);
1254  p_set->len = new_len;
1255  }
1256  p_set->pools[p_set->num++] = pool;
1257  return ABT_SUCCESS;
1258 }
1259 
1261  FILE *fp, double timeout, void (*cb_func)(ABT_bool, void *), void *arg)
1262 {
1263  /* This function is signal-safe, so it may not call other functions unless
1264  * you really know what the called functions do. */
1270  /* Save fp and timeout. */
1271  print_stack_fp = fp;
1272  print_stack_timeout = timeout;
1273  print_cb_func = cb_func;
1274  print_arg = arg;
1275  /* Here print_stack_barrier must be 0. */
1277  0);
1280  }
1281  }
1282 }
1283 
1284 ABTU_ret_err static int print_all_thread_stacks(ABTI_global *p_global, FILE *fp)
1285 {
1286  size_t i;
1287  int abt_errno;
1288  struct info_pool_set_t pool_set;
1289 
1290  abt_errno = info_initialize_pool_set(&pool_set);
1291  ABTI_CHECK_ERROR(abt_errno);
1292  ABTI_xstream *p_xstream = p_global->p_xstream_head;
1293  while (p_xstream) {
1294  ABTI_sched *p_main_sched = p_xstream->p_main_sched;
1295  fprintf(fp, "= xstream[%d] (%p) =\n", p_xstream->rank,
1296  (void *)p_xstream);
1297  fprintf(fp, "main_sched : %p\n", (void *)p_main_sched);
1298  if (!p_main_sched)
1299  continue;
1300  for (i = 0; i < p_main_sched->num_pools; i++) {
1301  ABT_pool pool = p_main_sched->pools[i];
1302  ABTI_ASSERT(pool != ABT_POOL_NULL);
1303  fprintf(fp, " pools[%zu] : %p\n", i,
1304  (void *)ABTI_pool_get_ptr(pool));
1305  abt_errno = info_add_pool_set(pool, &pool_set);
1306  if (ABTI_IS_ERROR_CHECK_ENABLED && abt_errno != ABT_SUCCESS) {
1307  info_finalize_pool_set(&pool_set);
1308  ABTI_HANDLE_ERROR(abt_errno);
1309  }
1310  }
1311  p_xstream = p_xstream->p_next;
1312  }
1313  for (i = 0; i < pool_set.num; i++) {
1314  ABT_pool pool = pool_set.pools[i];
1315  ABTI_pool *p_pool = ABTI_pool_get_ptr(pool);
1316  abt_errno = info_print_thread_stacks_in_pool(fp, p_pool);
1317  if (abt_errno != ABT_SUCCESS)
1318  fprintf(fp, " Failed to print (errno = %d).\n", abt_errno);
1319  }
1320  info_finalize_pool_set(&pool_set);
1321  return ABT_SUCCESS;
1322 }
ABT_INFO_QUERY_KIND_ENABLED_STACK_OVERFLOW_CHECK
@ ABT_INFO_QUERY_KIND_ENABLED_STACK_OVERFLOW_CHECK
Definition: abt.h:621
ABTI_CHECK_NULL_SCHED_PTR
#define ABTI_CHECK_NULL_SCHED_PTR(p)
Definition: abti_error.h:177
ABTD_atomic_fetch_sub_int
static int ABTD_atomic_fetch_sub_int(ABTD_atomic_int *ptr, int v)
Definition: abtd_atomic.h:487
ABT_info_print_xstream
int ABT_info_print_xstream(FILE *fp, ABT_xstream xstream)
Print the information of an execution stream.
Definition: info.c:516
ABTI_sched_get_ptr
static ABTI_sched * ABTI_sched_get_ptr(ABT_sched sched)
Definition: abti_sched.h:11
ABTI_global::sched_sleep_nsec
uint64_t sched_sleep_nsec
Definition: abti.h:212
info_print_unit_arg_t::fp
FILE * fp
Definition: info.c:1170
ABT_bool
int ABT_bool
Boolean type.
Definition: abt.h:1001
ABTI_global::sched_stacksize
size_t sched_stacksize
Definition: abti.h:210
info_trigger_print_all_thread_stacks
static void info_trigger_print_all_thread_stacks(FILE *fp, double timeout, void(*cb_func)(ABT_bool, void *), void *arg)
Definition: info.c:1263
ABTI_MEM_LP_MMAP_HP_THP
@ ABTI_MEM_LP_MMAP_HP_THP
Definition: abti_mem.h:21
ABTD_atomic_int
Definition: abtd_atomic.h:15
ABTI_CHECK_NULL_TASK_PTR
#define ABTI_CHECK_NULL_TASK_PTR(p)
Definition: abti_error.h:222
ABTU_realloc
static ABTU_ret_err int ABTU_realloc(size_t old_size, size_t new_size, void **p_ptr)
Definition: abtu.h:283
ABT_info_print_thread_attr
int ABT_info_print_thread_attr(FILE *fp, ABT_thread_attr attr)
Print the information of a ULT attribute.
Definition: info.c:685
ABTI_pool::p_print_all
ABT_pool_print_all_fn p_print_all
Definition: abti.h:351
ABT_thread_attr
struct ABT_thread_attr_opaque * ABT_thread_attr
ULT attribute handle type.
Definition: abt.h:897
ABT_task
struct ABT_thread_opaque * ABT_task
Work unit handle type.
Definition: abt.h:931
ABT_thread
struct ABT_thread_opaque * ABT_thread
Work unit handle type.
Definition: abt.h:890
ABTI_SETUP_GLOBAL
#define ABTI_SETUP_GLOBAL(pp_global)
Definition: abti_error.h:59
ABTI_global::xstream_list_lock
ABTD_spinlock xstream_list_lock
Definition: abti.h:201
ABT_info_print_all_xstreams
int ABT_info_print_all_xstreams(FILE *fp)
Print the information of all execution streams.
Definition: info.c:455
ABTI_thread::type
ABTI_thread_type type
Definition: abti.h:375
ABT_INFO_QUERY_KIND_DEFAULT_SCHED_STACKSIZE
@ ABT_INFO_QUERY_KIND_DEFAULT_SCHED_STACKSIZE
Definition: abt.h:607
ABTI_global_get_global
static ABTI_global * ABTI_global_get_global(void)
Definition: abti_global.h:9
ABT_INFO_QUERY_KIND_ENABLED_STACK_UNWIND
@ ABT_INFO_QUERY_KIND_ENABLED_STACK_UNWIND
Definition: abt.h:619
info_print_unit_arg_t
Definition: info.c:1169
ABT_ERR_POOL
#define ABT_ERR_POOL
Error code: error related to a pool.
Definition: abt.h:282
info_finalize_pool_set
static void info_finalize_pool_set(struct info_pool_set_t *p_set)
Definition: info.c:1237
ABTI_thread_print
void ABTI_thread_print(ABTI_thread *p_thread, FILE *p_os, int indent)
Definition: thread.c:2461
ABTI_info_check_print_all_thread_stacks
void ABTI_info_check_print_all_thread_stacks(void)
Definition: info.c:939
ABTI_CHECK_ERROR
#define ABTI_CHECK_ERROR(abt_errno)
Definition: abti_error.h:120
ABTI_sched::num_pools
size_t num_pools
Definition: abti.h:299
ABT_THREAD_TYPE_DYNAMIC_PROMOTION
#define ABT_THREAD_TYPE_DYNAMIC_PROMOTION
Definition: abti.h:65
ABTI_xstream::rank
int rank
Definition: abti.h:269
ABTI_MEM_LP_MALLOC
@ ABTI_MEM_LP_MALLOC
Definition: abti_mem.h:18
ABTI_THREAD_TYPE_YIELDABLE
#define ABTI_THREAD_TYPE_YIELDABLE
Definition: abti.h:86
ABTI_thread_get_ythread
static ABTI_ythread * ABTI_thread_get_ythread(ABTI_thread *p_thread)
Definition: abti_thread.h:52
ABTI_thread_get_id
ABT_unit_id ABTI_thread_get_id(ABTI_thread *p_thread)
Definition: thread.c:2561
print_stack_flag
static ABTD_atomic_int print_stack_flag
Definition: info.c:930
ABTI_global::print_config
ABT_bool print_config
Definition: abti.h:238
ABT_CONFIG_USE_FCONTEXT
#define ABT_CONFIG_USE_FCONTEXT
Definition: abt_config.h:96
print_stack_fp
static FILE * print_stack_fp
Definition: info.c:932
ABT_info_trigger_print_all_thread_stacks
int ABT_info_trigger_print_all_thread_stacks(FILE *fp, double timeout, void(*cb_func)(ABT_bool, void *), void *arg)
Print stacks of work units in pools associated with all the main schedulers.
Definition: info.c:910
ABT_INFO_QUERY_KIND_ENABLED_MIGRATION
@ ABT_INFO_QUERY_KIND_ENABLED_MIGRATION
Definition: abt.h:590
ABT_info_print_thread_stacks_in_pool
int ABT_info_print_thread_stacks_in_pool(FILE *fp, ABT_pool pool)
Print stacks of all work units in a pool.
Definition: info.c:834
print_cb_func
static void(* print_cb_func)(ABT_bool, void *)
Definition: info.c:934
ABT_CONFIG_DISABLE_TOOL_INTERFACE
#define ABT_CONFIG_DISABLE_TOOL_INTERFACE
Definition: abt_config.h:42
ABTI_thread
Definition: abti.h:371
ABTI_IS_ERROR_CHECK_ENABLED
#define ABTI_IS_ERROR_CHECK_ENABLED
Definition: abti.h:20
ABTI_thread_attr_get_ptr
static ABTI_thread_attr * ABTI_thread_attr_get_ptr(ABT_thread_attr attr)
Definition: abti_thread_attr.h:11
info_pool_set_t
Definition: info.c:1173
ABTI_xstream
Definition: abti.h:264
ABTI_CHECK_NULL_THREAD_ATTR_PTR
#define ABTI_CHECK_NULL_THREAD_ATTR_PTR(p)
Definition: abti_error.h:213
ABT_pool
struct ABT_pool_opaque * ABT_pool
Pool handle type.
Definition: abt.h:841
info_print_thread_stacks_in_pool
static ABTU_ret_err int info_print_thread_stacks_in_pool(FILE *fp, ABTI_pool *p_pool)
Definition: info.c:1205
ABTI_xstream::p_next
ABTI_xstream * p_next
Definition: abti.h:267
ABT_CONFIG_THREAD_TYPE
#define ABT_CONFIG_THREAD_TYPE
Definition: abt_config.h:78
ABTI_thread_attr_print
void ABTI_thread_attr_print(ABTI_thread_attr *p_attr, FILE *p_os, int indent)
Definition: thread_attr.c:369
ABTI_thread_attr
Definition: abti.h:388
ABT_sched
struct ABT_sched_opaque * ABT_sched
Scheduler handle type.
Definition: abt.h:808
ABT_INFO_QUERY_KIND_FCONTEXT
@ ABT_INFO_QUERY_KIND_FCONTEXT
Definition: abt.h:615
ABT_ERR_INV_QUERY_KIND
#define ABT_ERR_INV_QUERY_KIND
Error code: invalid query kind.
Definition: abt.h:240
ABTI_pool
Definition: abti.h:327
print_stack_timeout
static double print_stack_timeout
Definition: info.c:933
ABTI_MEM_LP_THP
@ ABTI_MEM_LP_THP
Definition: abti_mem.h:22
ABT_POOL_NULL
#define ABT_POOL_NULL
Definition: abt.h:1059
info_print_unit
static void info_print_unit(void *arg, ABT_unit unit)
Definition: info.c:1179
ABT_INFO_QUERY_KIND_ENABLED_EXTERNAL_THREAD
@ ABT_INFO_QUERY_KIND_ENABLED_EXTERNAL_THREAD
Definition: abt.h:594
abti.h
ABTI_CHECK_NULL_THREAD_PTR
#define ABTI_CHECK_NULL_THREAD_PTR(p)
Definition: abti_error.h:195
ABT_INFO_QUERY_KIND_ENABLED_AFFINITY
@ ABT_INFO_QUERY_KIND_ENABLED_AFFINITY
Definition: abt.h:601
ABTI_global::use_logging
ABT_bool use_logging
Definition: abti.h:206
ABT_info_query_config
int ABT_info_query_config(ABT_info_query_kind query_kind, void *val)
Retrieve the configuration information.
Definition: info.c:206
info_pool_set_t::num
size_t num
Definition: info.c:1175
ABT_INFO_QUERY_KIND_ENABLED_CHECK_POOL_PRODUCER
@ ABT_INFO_QUERY_KIND_ENABLED_CHECK_POOL_PRODUCER
Definition: abt.h:579
ABT_unit_id
uint64_t ABT_unit_id
Work unit ID type.
Definition: abt.h:879
ABT_xstream
struct ABT_xstream_opaque * ABT_xstream
Execution stream handle type.
Definition: abt.h:789
ABT_info_print_thread_stack
int ABT_info_print_thread_stack(FILE *fp, ABT_thread thread)
Print stack of a work unit.
Definition: info.c:779
ABT_INFO_QUERY_KIND_ENABLED_VALGRIND
@ ABT_INFO_QUERY_KIND_ENABLED_VALGRIND
Definition: abt.h:575
ABTI_global::thread_stacksize
size_t thread_stacksize
Definition: abti.h:209
ABTD_spinlock_acquire
static void ABTD_spinlock_acquire(ABTD_spinlock *p_lock)
Definition: abtd_spinlock.h:28
ABT_CONFIG_USE_CLOCK_GETTIME
#define ABT_CONFIG_USE_CLOCK_GETTIME
Definition: abt_config.h:84
ABTI_HANDLE_ERROR
#define ABTI_HANDLE_ERROR(n)
Definition: abti_error.h:114
ABTD_atomic_pause
static void ABTD_atomic_pause(void)
Definition: abtd_atomic.h:1257
ABTI_global::huge_page_size
size_t huge_page_size
Definition: abti.h:218
ABTU_malloc
static ABTU_ret_err int ABTU_malloc(size_t size, void **p_ptr)
Definition: abtu.h:262
ABTI_MEM_LP_MMAP_HP_RP
@ ABTI_MEM_LP_MMAP_HP_RP
Definition: abti_mem.h:20
ABT_info_query_kind
ABT_info_query_kind
Query kind for ABT_info_query_config().
Definition: abt.h:567
ABT_INFO_QUERY_KIND_ENABLED_STACKABLE_SCHED
@ ABT_INFO_QUERY_KIND_ENABLED_STACKABLE_SCHED
Definition: abt.h:592
PRINT_STACK_FLAG_INITIALIZE
#define PRINT_STACK_FLAG_INITIALIZE
Definition: info.c:926
ABTI_xstream::p_main_sched
ABTI_sched * p_main_sched
Definition: abti.h:272
ABT_INFO_QUERY_KIND_ENABLED_PRINT_CONFIG
@ ABT_INFO_QUERY_KIND_ENABLED_PRINT_CONFIG
Definition: abt.h:599
info_add_pool_set
static ABTU_ret_err int info_add_pool_set(ABT_pool pool, struct info_pool_set_t *p_set)
Definition: info.c:1242
ABTI_global::sched_event_freq
uint32_t sched_event_freq
Definition: abti.h:211
info_pool_set_t::pools
ABT_pool * pools
Definition: info.c:1174
ABT_unit
struct ABT_unit_opaque * ABT_unit
Work unit handle type for scheduling.
Definition: abt.h:869
ABT_INFO_QUERY_KIND_ENABLED_DEBUG
@ ABT_INFO_QUERY_KIND_ENABLED_DEBUG
Definition: abt.h:569
ABTI_ythread::ctx
ABTD_ythread_context ctx
Definition: abti.h:408
ABTI_xstream_print
void ABTI_xstream_print(ABTI_xstream *p_xstream, FILE *p_os, int indent, ABT_bool print_sub)
Definition: stream.c:1620
ABTI_ASSERT
#define ABTI_ASSERT(cond)
Definition: abti_error.h:12
ABTI_sched::pools
ABT_pool * pools
Definition: abti.h:298
ABT_CONFIG_STATIC_CACHELINE_SIZE
#define ABT_CONFIG_STATIC_CACHELINE_SIZE
Definition: abt_config.h:72
ABTI_global::num_xstreams
int num_xstreams
Definition: abti.h:198
ABTD_atomic_fetch_add_int
static int ABTD_atomic_fetch_add_int(ABTD_atomic_int *ptr, int v)
Definition: abtd_atomic.h:429
ABT_INFO_QUERY_KIND_ENABLED_TOOL
@ ABT_INFO_QUERY_KIND_ENABLED_TOOL
Definition: abt.h:613
ABT_SUCCESS
#define ABT_SUCCESS
Error code: the routine returns successfully.
Definition: abt.h:92
PRINT_STACK_FLAG_UNSET
#define PRINT_STACK_FLAG_UNSET
Definition: info.c:925
ABTU_ret_err
#define ABTU_ret_err
Definition: abtu.h:146
ABT_INFO_QUERY_KIND_DYNAMIC_PROMOTION
@ ABT_INFO_QUERY_KIND_DYNAMIC_PROMOTION
Definition: abt.h:617
ABTI_global::p_xstream_head
ABTI_xstream * p_xstream_head
Definition: abti.h:199
ABTD_atomic_acquire_load_int
static int ABTD_atomic_acquire_load_int(const ABTD_atomic_int *ptr)
Definition: abtd_atomic.h:878
print_stack_barrier
static ABTD_atomic_int print_stack_barrier
Definition: info.c:936
ABT_info_print_pool
int ABT_info_print_pool(FILE *fp, ABT_pool pool)
Print the information of a pool.
Definition: info.c:598
ABT_INFO_QUERY_KIND_DEFAULT_THREAD_STACKSIZE
@ ABT_INFO_QUERY_KIND_DEFAULT_THREAD_STACKSIZE
Definition: abt.h:605
ABT_TRUE
#define ABT_TRUE
True constant for ABT_bool.
Definition: abt.h:748
ABTI_pool_get_ptr
static ABTI_pool * ABTI_pool_get_ptr(ABT_pool pool)
Definition: abti_pool.h:11
ABTD_ATOMIC_INT_STATIC_INITIALIZER
#define ABTD_ATOMIC_INT_STATIC_INITIALIZER(val)
Definition: abtd_atomic.h:47
ABT_INFO_QUERY_KIND_ENABLED_CHECK_POOL_CONSUMER
@ ABT_INFO_QUERY_KIND_ENABLED_CHECK_POOL_CONSUMER
Definition: abt.h:581
ABTI_global::key_table_size
uint32_t key_table_size
Definition: abti.h:208
PRINT_STACK_FLAG_WAIT
#define PRINT_STACK_FLAG_WAIT
Definition: info.c:927
ABTI_sched
Definition: abti.h:289
ABT_INFO_QUERY_KIND_ENABLED_CHECK_ERROR
@ ABT_INFO_QUERY_KIND_ENABLED_CHECK_ERROR
Definition: abt.h:577
ABT_FALSE
#define ABT_FALSE
False constant for ABT_bool.
Definition: abt.h:750
ABTI_ythread
Definition: abti.h:406
ABT_info_print_thread
int ABT_info_print_thread(FILE *fp, ABT_thread thread)
Print the information of a work unit.
Definition: info.c:644
ABTI_CHECK_NULL_POOL_PTR
#define ABTI_CHECK_NULL_POOL_PTR(p)
Definition: abti_error.h:168
print_arg
static void * print_arg
Definition: info.c:935
ABTI_CHECK_NULL_XSTREAM_PTR
#define ABTI_CHECK_NULL_XSTREAM_PTR(p)
Definition: abti_error.h:159
ABTU_free
static void ABTU_free(void *ptr)
Definition: abtu.h:217
ABTD_spinlock_release
static void ABTD_spinlock_release(ABTD_spinlock *p_lock)
Definition: abtd_spinlock.h:42
ABTI_unit_get_thread
static ABTI_thread * ABTI_unit_get_thread(ABTI_global *p_global, ABT_unit unit)
Definition: abti_unit.h:43
print_all_thread_stacks
static ABTU_ret_err int print_all_thread_stacks(ABTI_global *p_global, FILE *fp)
Definition: info.c:1287
ABTI_xstream_get_ptr
static ABTI_xstream * ABTI_xstream_get_ptr(ABT_xstream xstream)
Definition: abti_stream.h:11
ABT_INFO_QUERY_KIND_ENABLED_PRESERVE_FPU
@ ABT_INFO_QUERY_KIND_ENABLED_PRESERVE_FPU
Definition: abt.h:584
ABTI_global::use_debug
ABT_bool use_debug
Definition: abti.h:207
ABTD_atomic_bool_cas_strong_int
static int ABTD_atomic_bool_cas_strong_int(ABTD_atomic_int *ptr, int oldv, int newv)
Definition: abtd_atomic.h:385
ABTI_ythread_print_stack
void ABTI_ythread_print_stack(ABTI_ythread *p_ythread, FILE *p_os)
Definition: ythread.c:100
ABT_INFO_QUERY_KIND_ENABLED_PRINT_ERRNO
@ ABT_INFO_QUERY_KIND_ENABLED_PRINT_ERRNO
Definition: abt.h:571
ABTI_ythread::thread
ABTI_thread thread
Definition: abti.h:407
ABT_info_print_task
int ABT_info_print_task(FILE *fp, ABT_task task)
Print the information of a work unit.
Definition: info.c:732
ABT_info_print_config
int ABT_info_print_config(FILE *fp)
Print the runtime information of Argobots.
Definition: info.c:408
ABTI_global::set_affinity
ABT_bool set_affinity
Definition: abti.h:205
ABTI_info_print_config
void ABTI_info_print_config(ABTI_global *p_global, FILE *fp)
Definition: info.c:1010
ABTI_pool_print
void ABTI_pool_print(ABTI_pool *p_pool, FILE *p_os, int indent)
Definition: pool.c:901
ABTI_CHECK_TRUE
#define ABTI_CHECK_TRUE(cond, abt_errno)
Definition: abti_error.h:130
ABTI_global
Definition: abti.h:196
ABT_INFO_QUERY_KIND_ENABLED_TASK_CANCEL
@ ABT_INFO_QUERY_KIND_ENABLED_TASK_CANCEL
Definition: abt.h:588
ABT_INFO_QUERY_KIND_DEFAULT_SCHED_EVENT_FREQ
@ ABT_INFO_QUERY_KIND_DEFAULT_SCHED_EVENT_FREQ
Definition: abt.h:609
ABTI_global::num_cores
int num_cores
Definition: abti.h:204
ABT_INFO_QUERY_KIND_WAIT_POLICY
@ ABT_INFO_QUERY_KIND_WAIT_POLICY
Definition: abt.h:623
ABTI_MEM_LP_MMAP_RP
@ ABTI_MEM_LP_MMAP_RP
Definition: abti_mem.h:19
ABTD_FCONTEXT_PRESERVE_FPU
#define ABTD_FCONTEXT_PRESERVE_FPU
Definition: abt_config.h:15
info_pool_set_t::len
size_t len
Definition: info.c:1176
ABTD_atomic_release_store_int
static void ABTD_atomic_release_store_int(ABTD_atomic_int *ptr, int val)
Definition: abtd_atomic.h:1065
ABTI_global::max_xstreams
int max_xstreams
Definition: abti.h:197
ABTI_global_get_global_or_null
static ABTI_global * ABTI_global_get_global_or_null(void)
Definition: abti_global.h:15
ABT_info_print_sched
int ABT_info_print_sched(FILE *fp, ABT_sched sched)
Print the information of a scheduler.
Definition: info.c:557
ABTI_thread_get_ptr
static ABTI_thread * ABTI_thread_get_ptr(ABT_thread thread)
Definition: abti_thread.h:9
info_initialize_pool_set
static ABTU_ret_err int info_initialize_pool_set(struct info_pool_set_t *p_set)
Definition: info.c:1226
ABTI_get_wtime
static double ABTI_get_wtime(void)
Definition: abti_timer.h:11
ABTI_pool_get_handle
static ABT_pool ABTI_pool_get_handle(ABTI_pool *p_pool)
Definition: abti_pool.h:26
ABT_INFO_QUERY_KIND_MAX_NUM_XSTREAMS
@ ABT_INFO_QUERY_KIND_MAX_NUM_XSTREAMS
Definition: abt.h:603
ABT_INFO_QUERY_KIND_DEFAULT_SCHED_SLEEP_NSEC
@ ABT_INFO_QUERY_KIND_DEFAULT_SCHED_SLEEP_NSEC
Definition: abt.h:611
ABT_INFO_QUERY_KIND_ENABLED_LOG
@ ABT_INFO_QUERY_KIND_ENABLED_LOG
Definition: abt.h:573
PRINT_STACK_FLAG_FINALIZE
#define PRINT_STACK_FLAG_FINALIZE
Definition: info.c:928
ABT_VERSION
#define ABT_VERSION
Version string of Argobots.
Definition: abt.h:46
ABT_INFO_QUERY_KIND_ENABLED_THREAD_CANCEL
@ ABT_INFO_QUERY_KIND_ENABLED_THREAD_CANCEL
Definition: abt.h:586
ABT_INFO_QUERY_KIND_ENABLED_SCHED_SLEEP
@ ABT_INFO_QUERY_KIND_ENABLED_SCHED_SLEEP
Definition: abt.h:596
ABTI_sched_print
void ABTI_sched_print(ABTI_sched *p_sched, FILE *p_os, int indent, ABT_bool print_sub)
Definition: sched.c:959