View | Details | Raw Unified | Return to bug 255591 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/compat/linux/linux_futex.c (-5 / +53 lines)
Lines 680-698 futex_atomic_op(struct thread *td, int encoded_op, uint32_t *uaddr) Link Here
680
680
681
	switch (op) {
681
	switch (op) {
682
	case FUTEX_OP_SET:
682
	case FUTEX_OP_SET:
683
		ret = futex_xchgl(oparg, uaddr, &oldval);
683
//		ret = futex_xchgl(oparg, uaddr, &oldval);
684
685
		ret = fueword32(uaddr, &oldval);
686
		if (ret != 0)
687
			return (ret);
688
		oldval = atomic_swap_int(&oldval, oparg);
689
		ret = suword32(uaddr, oldval);
690
		if (ret != 0)
691
			return (ret);
692
		
684
		break;
693
		break;
685
	case FUTEX_OP_ADD:
694
	case FUTEX_OP_ADD:
686
		ret = futex_addl(oparg, uaddr, &oldval);
695
//		ret = futex_addl(oparg, uaddr, &oldval);
696
697
		ret = fueword32(uaddr, &oldval);
698
		if (ret != 0)
699
			return (ret);
700
		oldval = atomic_fetchadd_int(&oldval, oparg);
701
		ret = suword32(uaddr, oldval);
702
		if (ret != 0)
703
			return (ret);
704
687
		break;
705
		break;
688
	case FUTEX_OP_OR:
706
	case FUTEX_OP_OR:
689
		ret = futex_orl(oparg, uaddr, &oldval);
707
//		ret = futex_orl(oparg, uaddr, &oldval);
708
709
		ret = fueword32(uaddr, &oldval);
710
		if (ret != 0)
711
			return (ret);
712
		while (!atomic_fcmpset_int(&oldval, &oldval, oldval | oparg))
713
			;
714
		ret = suword32(uaddr, oldval);
715
		if (ret != 0)
716
			return (ret);
717
690
		break;
718
		break;
691
	case FUTEX_OP_ANDN:
719
	case FUTEX_OP_ANDN:
692
		ret = futex_andl(~oparg, uaddr, &oldval);
720
//		ret = futex_andl(~oparg, uaddr, &oldval);
721
722
		ret = fueword32(uaddr, &oldval);
723
		if (ret != 0)
724
			return (ret);
725
		while (!atomic_fcmpset_int(&oldval, &oldval, oldval & (~oparg)))
726
			;
727
		ret = suword32(uaddr, oldval);
728
		if (ret != 0)
729
			return (ret);
730
693
		break;
731
		break;
694
	case FUTEX_OP_XOR:
732
	case FUTEX_OP_XOR:
695
		ret = futex_xorl(oparg, uaddr, &oldval);
733
//		ret = futex_xorl(oparg, uaddr, &oldval);
734
735
		ret = fueword32(uaddr, &oldval);
736
		if (ret != 0)
737
			return (ret);
738
		while (!atomic_fcmpset_int(&oldval, &oldval, oldval ^ oparg))
739
			;
740
		ret = suword32(uaddr, oldval);
741
		if (ret != 0)
742
			return (ret);
743
696
		break;
744
		break;
697
	default:
745
	default:
698
		LIN_SDT_PROBE1(futex, futex_atomic_op, unimplemented_op, op);
746
		LIN_SDT_PROBE1(futex, futex_atomic_op, unimplemented_op, op);

Return to bug 255591