@@ -492,6 +492,19 @@ bool context_get_process_info(Context *ctx, term *out, size_t *term_size, term a
492492 }
493493 break ;
494494 }
495+ case MONITORED_BY_ATOM : {
496+ struct ListHead * item ;
497+ ret_size = TUPLE_SIZE (2 );
498+ LIST_FOR_EACH (item , & ctx -> monitors_head ) {
499+ struct Monitor * monitor = GET_LIST_ENTRY (item , struct Monitor , monitor_list_head );
500+ if (monitor -> monitor_type == CONTEXT_MONITOR_MONITORED_LOCAL ) {
501+ ret_size += CONS_SIZE ;
502+ } else if (monitor -> monitor_type == CONTEXT_MONITOR_RESOURCE ) {
503+ ret_size += CONS_SIZE + TERM_BOXED_RESOURCE_SIZE ;
504+ }
505+ }
506+ break ;
507+ }
495508 default :
496509 if (out != NULL ) {
497510 * out = BADARG_ATOM ;
@@ -582,6 +595,24 @@ bool context_get_process_info(Context *ctx, term *out, size_t *term_size, term a
582595 term_put_tuple_element (ret , 1 , list );
583596 break ;
584597 }
598+ // pids of monitoring processes / resources
599+ case MONITORED_BY_ATOM : {
600+ term_put_tuple_element (ret , 0 , MONITORED_BY_ATOM );
601+ term list = term_nil ();
602+ struct ListHead * item ;
603+ LIST_FOR_EACH (item , & ctx -> monitors_head ) {
604+ struct Monitor * monitor = GET_LIST_ENTRY (item , struct Monitor , monitor_list_head );
605+ if (monitor -> monitor_type == CONTEXT_MONITOR_MONITORED_LOCAL ) {
606+ struct MonitorLocalMonitor * monitored_monitor = CONTAINER_OF (monitor , struct MonitorLocalMonitor , monitor );
607+ list = term_list_prepend (monitored_monitor -> monitor_obj , list , heap );
608+ } else if (monitor -> monitor_type == CONTEXT_MONITOR_RESOURCE ) {
609+ struct ResourceContextMonitor * resource_monitor = CONTAINER_OF (monitor , struct ResourceContextMonitor , monitor );
610+ list = term_list_prepend (term_from_resource (resource_monitor -> resource_obj , heap ), list , heap );
611+ }
612+ }
613+ term_put_tuple_element (ret , 1 , list );
614+ break ;
615+ }
585616
586617 default :
587618 UNREACHABLE ();
0 commit comments