/*
* Copyright 2017 NAVER Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.navercorp.pinpoint.profiler.context.id;
import com.google.inject.Inject;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author emeroad
* @author HyunGil Jeong
*/
public class AtomicIdGenerator implements IdGenerator {
// TODO might be a good idea to refactor these into SamplingType
// Reserved negative space (0 ~ -1000)
public static final long UNTRACKED_ID = 0L;
public static final long RESERVED_MAX = 0L;
public static final long RESERVED_MIN = -1000;
// Positive value for sampled new traces
public static final long INITIAL_TRANSACTION_ID = 1L;
// Negative value for sampled continuations, and unsampled new traces/continuations
public static final long INITIAL_CONTINUED_TRANSACTION_ID = RESERVED_MIN - 1; // -1001
public static final long INITIAL_DISABLED_ID = RESERVED_MIN - 2; // -1002
public static final long INITIAL_CONTINUED_DISABLED_ID = RESERVED_MIN - 3; // -1003
public static final int DECREMENT_CYCLE = 3;
public static final int NEGATIVE_DECREMENT_CYCLE = DECREMENT_CYCLE * -1;
// Unique id for tracing a internal stacktrace and calculating a slow time of activethreadcount
// moved here in order to make codes simpler for now
// id generator for sampled new traces
private final AtomicLong transactionId = new AtomicLong(INITIAL_TRANSACTION_ID);
// id generator for sampled continued traces
private final AtomicLong continuedTransactionId = new AtomicLong(INITIAL_CONTINUED_TRANSACTION_ID);
// id generator for unsampled new traces
private final AtomicLong disabledId = new AtomicLong(INITIAL_DISABLED_ID);
// id generator for unsampled continued traces
private final AtomicLong continuedDisabledId = new AtomicLong(INITIAL_CONTINUED_DISABLED_ID);
@Inject
public AtomicIdGenerator() {
}
@Override
public long nextTransactionId() {
return this.transactionId.getAndIncrement();
}
@Override
public long nextContinuedTransactionId() {
return this.continuedTransactionId.getAndAdd(NEGATIVE_DECREMENT_CYCLE);
}
@Override
public long nextDisabledId() {
return this.disabledId.getAndAdd(NEGATIVE_DECREMENT_CYCLE);
}
@Override
public long nextContinuedDisabledId() {
return this.continuedDisabledId.getAndAdd(NEGATIVE_DECREMENT_CYCLE);
}
@Override
public long currentTransactionId() {
return this.transactionId.get();
}
@Override
public long currentContinuedTransactionId() {
return this.continuedTransactionId.get();
}
@Override
public long currentDisabledId() {
return this.disabledId.get();
}
@Override
public long currentContinuedDisabledId() {
return this.continuedDisabledId.get();
}
}