func()

in ibazel/process_group/process_group_windows.go [43:91]


func (pg *winProcessGroup) Start() error {
	if pg.job != 0 {
		return errors.New("job already started")
	}

	err := pg.root.Start()
	if err != nil {
		return err
	}

	pg.job, err = createJobObject()
	if err != nil {
		return err
	}

	pg.ioport, err = syscall.CreateIoCompletionPort(syscall.InvalidHandle, syscall.Handle(0), 0, 1)
	if err != nil {
		return err
	}

	port := jobObjectAssociationCompletionPort{
		CompletionKey:  pg.job,
		CompletionPort: pg.ioport,
	}

	err = setInformationJobObject(pg.job, jobObjectAssociateCompletionPortInformation, uintptr(unsafe.Pointer(&port)), unsafe.Sizeof(port))
	if err != nil {
		return err
	}

	process, err := syscall.OpenProcess(processAllAccess, false, uint32(pg.root.Process.Pid))
	if err != nil {
		return err
	}

	err = assignProcessToJobObject(pg.job, process)
	if err != nil {
		return err
	}

	err = ntResumeProcess(process)
	if err != nil {
		return err
	}

	syscall.CloseHandle(process)

	return nil
}