protected void abort(ActivityExecutor executor,
			BookmarkManager bookmarkManager,
			Exception reason,
			boolean isTerminate) {
		ActivityInstance root = this;
		ActivityInstance current = this;

		// depth first and avoid recursion
		while (current.hasChildren())
			current = current.children.get(0);

		while (true) {
			// maybe arugment resovle error or branch not executed
			if (current.hasNotExecuted())
				current.getActivity().internalAbort(current, executor, reason);

			// transaction can be rollback here
			// ...

			// maybe root
			executor.handleRootCompletion(current);
			// must remove self from parent
			current.markAsComplete();
			current.state = ActivityInstanceState.Faulted;
			current.finalize(false);

			if (current == root)
				break;
			current = current.getParent();
			while (current.hasChildren())
				current = current.children.get(0);

		}
	}