func (dbp *Process) updateThreadList() error { var ( err error kret C.kern_return_t count = C.thread_count(C.task_t(dbp.os.task)) ) if count == -1 { return fmt.Errorf("could not get thread count") } list := make([]uint32, count) // TODO(dp) might be better to malloc mem in C and then free it here // instead of getting count above and passing in a slice kret = C.get_threads(C.task_t(dbp.os.task), unsafe.Pointer(&list[0])) if kret != C.KERN_SUCCESS { return fmt.Errorf("could not get thread list") } if count < 0 { return fmt.Errorf("could not get thread list") } for _, port := range list { if _, ok := dbp.Threads[int(port)]; !ok { _, err = dbp.addThread(int(port), false) if err != nil { return err } } } return nil }
func (dbp *Process) waitForStop() ([]int, error) { ports := make([]int, 0, len(dbp.Threads)) count := 0 for { port := C.mach_port_wait(dbp.os.portSet, C.int(1)) if port != 0 { count = 0 ports = append(ports, int(port)) } else { n := C.num_running_threads(C.task_t(dbp.os.task)) if n == 0 { return ports, nil } else if n < 0 { return nil, fmt.Errorf("error waiting for thread stop %d", n) } else if count > 16 { return nil, fmt.Errorf("could not stop process %d", n) } } } }