public int InsertBreakpoint(Inferior inferior, BreakpointHandle handle,
                                    TargetAddress address, int domain)
        {
            Lock();
            try {
                int              index;
                bool             is_enabled;
                BreakpointHandle old = LookupBreakpoint(
                    address, out index, out is_enabled);
                if (old != null)
                {
                    throw new TargetException(
                              TargetError.AlreadyHaveBreakpoint,
                              "Already have breakpoint {0} at address {1}.",
                              old.Breakpoint.Index, address);
                }

                int dr_index = -1;
                switch (handle.Breakpoint.Type)
                {
                case EventType.Breakpoint:
                    index = inferior.InsertBreakpoint(address);
                    break;

                case EventType.WatchRead:
                    index = inferior.InsertHardwareWatchPoint(
                        address, Inferior.HardwareBreakpointType.READ,
                        out dr_index);
                    break;

                case EventType.WatchWrite:
                    index = inferior.InsertHardwareWatchPoint(
                        address, Inferior.HardwareBreakpointType.WRITE,
                        out dr_index);
                    break;

                default:
                    throw new InternalError();
                }

                index_hash.Add(index, new BreakpointEntry(handle, domain));
                return(index);
            } finally {
                Unlock();
            }
        }
		public override void Insert (Inferior inferior)
		{
			inferior.InsertBreakpoint (this, Address, -1);
			has_breakpoint = true;
		}