aboutsummaryrefslogtreecommitdiff
path: root/src/lanes.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lanes.c')
-rw-r--r--src/lanes.c45
1 files changed, 25 insertions, 20 deletions
diff --git a/src/lanes.c b/src/lanes.c
index 8f159a9..f3fdc76 100644
--- a/src/lanes.c
+++ b/src/lanes.c
@@ -1652,26 +1652,31 @@ LUAG_FUNC( thread_index)
1652// Return a list of all known lanes 1652// Return a list of all known lanes
1653LUAG_FUNC( threads) 1653LUAG_FUNC( threads)
1654{ 1654{
1655 int const top = lua_gettop( L); 1655 int const top = lua_gettop( L);
1656 Universe* U = universe_get( L); 1656 Universe* U = universe_get( L);
1657 1657
1658 // List _all_ still running threads 1658 // List _all_ still running threads
1659 // 1659 //
1660 MUTEX_LOCK( &U->tracking_cs); 1660 MUTEX_LOCK( &U->tracking_cs);
1661 if( U->tracking_first && U->tracking_first != TRACKING_END) 1661 if( U->tracking_first && U->tracking_first != TRACKING_END)
1662 { 1662 {
1663 Lane* s = U->tracking_first; 1663 Lane* s = U->tracking_first;
1664 lua_newtable( L); // {} 1664 int index = 0;
1665 while( s != TRACKING_END) 1665 lua_newtable( L); // {}
1666 { 1666 while( s != TRACKING_END)
1667 lua_pushstring( L, s->debug_name); // {} "name" 1667 {
1668 push_thread_status( L, s); // {} "name" "status" 1668 // insert a { name, status } tuple, so that several lanes with the same name can't clobber each other
1669 lua_rawset( L, -3); // {} 1669 lua_newtable( L); // {} {}
1670 s = s->tracking_next; 1670 lua_pushstring( L, s->debug_name); // {} {} "name"
1671 } 1671 lua_setfield( L, -2, "name"); // {} {}
1672 } 1672 push_thread_status( L, s); // {} {} "status"
1673 MUTEX_UNLOCK( &U->tracking_cs); 1673 lua_setfield( L, -2, "status"); // {} {}
1674 return lua_gettop( L) - top; 1674 lua_rawseti( L, -2, ++ index); // {}
1675 s = s->tracking_next;
1676 }
1677 }
1678 MUTEX_UNLOCK( &U->tracking_cs);
1679 return lua_gettop( L) - top; // 0 or 1
1675} 1680}
1676#endif // HAVE_LANE_TRACKING 1681#endif // HAVE_LANE_TRACKING
1677 1682