+struct darwin_exception_msg
+{
+ mach_msg_header_t header;
+
+ /* Thread and task taking the exception. */
+ mach_port_t thread_port;
+ mach_port_t task_port;
+
+ /* Type of the exception. */
+ exception_type_t ex_type;
+
+ /* Machine dependent details. */
+ mach_msg_type_number_t data_count;
+ integer_t ex_data[2];
+};
+
+enum darwin_msg_state
+{
+ /* The thread is running. */
+ DARWIN_RUNNING,
+
+ /* The thread is stopped. */
+ DARWIN_STOPPED,
+
+ /* The thread has sent a message and waits for a reply. */
+ DARWIN_MESSAGE
+};
+
+struct darwin_thread_info : public private_thread_info
+{
+ /* The thread port from a GDB point of view. */
+ thread_t gdb_port = 0;
+
+ /* The thread port from the inferior point of view. Not to be used inside
+ gdb except for get_ada_task_ptid. */
+ thread_t inf_port = 0;
+
+ /* Current message state.
+ If the kernel has sent a message it expects a reply and the inferior
+ can't be killed before. */
+ enum darwin_msg_state msg_state = DARWIN_RUNNING;
+
+ /* True if this thread is single-stepped. */
+ bool single_step = false;
+
+ /* True if a signal was manually sent to the thread. */
+ bool signaled = false;
+
+ /* The last exception received. */
+ struct darwin_exception_msg event {};
+};
+typedef struct darwin_thread_info darwin_thread_t;
+