py: Add MP_STATE_THREAD to hold state specific to a given thread.
diff --git a/py/mpstate.h b/py/mpstate.h
index 0e77e65..824aba1 100644
--- a/py/mpstate.h
+++ b/py/mpstate.h
@@ -91,9 +91,6 @@
     // this must start at the start of this structure
     //
 
-    // Note: nlr asm code has the offset of this hard-coded
-    nlr_buf_t *nlr_top;
-
     qstr_pool_t *last_pool;
 
     // non-heap memory for creating an exception if we can't allocate RAM
@@ -161,14 +158,6 @@
     size_t qstr_last_alloc;
     size_t qstr_last_used;
 
-    // Stack top at the start of program
-    // Note: this entry is used to locate the end of the root pointer section.
-    char *stack_top;
-
-    #if MICROPY_STACK_CHECK
-    mp_uint_t stack_limit;
-    #endif
-
     mp_uint_t mp_optimise_value;
 
     // size of the emergency exception buf, if it's dynamically allocated
@@ -177,7 +166,22 @@
     #endif
 } mp_state_vm_t;
 
-// This structure combines the above 2 structures, and adds the local
+// This structure holds state that is specific to a given thread.
+// Everything in this structure is scanned for root pointers.
+typedef struct _mp_state_thread_t {
+    // Note: nlr asm code has the offset of this hard-coded
+    nlr_buf_t *nlr_top; // ROOT POINTER
+
+    // Stack top at the start of program
+    // Note: this entry is used to locate the end of the root pointer section.
+    char *stack_top;
+
+    #if MICROPY_STACK_CHECK
+    size_t stack_limit;
+    #endif
+} mp_state_thread_t;
+
+// This structure combines the above 3 structures, and adds the local
 // and global dicts.
 // Note: if this structure changes then revisit all nlr asm code since they
 // have the offset of nlr_top hard-coded.
@@ -185,7 +189,8 @@
     // these must come first for root pointer scanning in GC to work
     mp_obj_dict_t *dict_locals;
     mp_obj_dict_t *dict_globals;
-    // this must come next for root pointer scanning in GC to work
+    // these must come next in this order for root pointer scanning in GC to work
+    mp_state_thread_t thread;
     mp_state_vm_t vm;
     mp_state_mem_t mem;
 } mp_state_ctx_t;
@@ -196,4 +201,6 @@
 #define MP_STATE_VM(x) (mp_state_ctx.vm.x)
 #define MP_STATE_MEM(x) (mp_state_ctx.mem.x)
 
+#define MP_STATE_THREAD(x) (mp_state_ctx.thread.x)
+
 #endif // __MICROPY_INCLUDED_PY_MPSTATE_H__