blob: 2f37d62f764a78935bbb9297f9ee2424abfc0b5b [file] [log] [blame]
Mark D. Rothfecba532017-03-17 09:50:48 -07001/*
2 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003 * Copyright 2017 gRPC authors.
Mark D. Rothfecba532017-03-17 09:50:48 -07004 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
Mark D. Rothfecba532017-03-17 09:50:48 -07008 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009 * http://www.apache.org/licenses/LICENSE-2.0
Mark D. Rothfecba532017-03-17 09:50:48 -070010 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
Mark D. Rothfecba532017-03-17 09:50:48 -070016 *
17 */
18
19#include <grpc/support/atm.h>
20#include <grpc/support/useful.h>
21
22gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm *value, gpr_atm delta,
23 gpr_atm min, gpr_atm max) {
Craig Tillered380162017-07-11 08:34:26 -070024 gpr_atm current_value;
25 gpr_atm new_value;
Mark D. Rothfecba532017-03-17 09:50:48 -070026 do {
Craig Tillered380162017-07-11 08:34:26 -070027 current_value = gpr_atm_no_barrier_load(value);
28 new_value = GPR_CLAMP(current_value + delta, min, max);
29 if (new_value == current_value) break;
30 } while (!gpr_atm_no_barrier_cas(value, current_value, new_value));
31 return new_value;
Mark D. Rothfecba532017-03-17 09:50:48 -070032}