Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ public final class LinuxNuma extends OSNuma.PreCalculatedNuma {
// it is set, so mark it in the core mapping
if (coreToNuma.length <= cpu) {
coreToNuma = Arrays.copyOf(coreToNuma, cpu + 1);
coreToNuma[cpu] = node;
}
coreToNuma[cpu] = node;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,10 @@ private ScheduledState returnTask(final TickThreadRunner runner, final Scheduled
@Override
public void schedule(final SchedulableTick task) {
synchronized (this.scheduleLock) {
if (task.getScheduledStart() == TimeUtil.DEADLINE_NOT_SET) {
throw new IllegalStateException("Start must be set when scheduling");
}

final ScheduledState state = new ScheduledState(task);
if (!task.setState(state)) {
throw new IllegalStateException("Task " + task + " is already scheduled or cancelled");
Expand Down Expand Up @@ -284,15 +288,18 @@ public boolean updateTickStartToMax(final ScheduledState task, final long newSta

@Override
public boolean cancel(final SchedulableTick task) {
if (!(task.state instanceof ScheduledState state)) {
return false;
}

if (state.schedulerOwnedBy != this) {
if (!(task.getState() instanceof ScheduledState state)) {
return false;
}

synchronized (this.scheduleLock) {
if (state.schedulerOwnedBy != this) {
return false;
}
if (!state.tryMarkCancelled()) {
return false;
}

if (this.queued.remove(state)) {
// cancelled, and no runner owns it - so return
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,11 @@ public abstract class SchedulableTick {

long scheduledStart = TimeUtil.DEADLINE_NOT_SET;

Object state;
private volatile Object state;

final Object getState() {
return this.state;
}

boolean setState(final Object state) {
synchronized (this) {
Expand Down Expand Up @@ -79,7 +83,7 @@ protected final void setScheduledStart(final long value) {
public String toString() {
return "SchedulableTick:{" +
"class=" + this.getClass().getName() + "," +
"state=" + this.state + ","
"state=" + this.getState() + ","
+ "}";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public OSNuma getNuma() {
}

private static ScheduledState getState(final SchedulableTick tick) {
return (ScheduledState)tick.state;
return (ScheduledState)tick.getState();
}

private static Thread[] getThreads(final COWArrayList<TickThreadRunner> runners) {
Expand Down Expand Up @@ -274,7 +274,8 @@ private TickThreadRunner selectRunner(final TickThreadRunner previousRunner, fin
int selectedSize = Integer.MAX_VALUE;

for (final NodeThreads node : nodes) {
final int distance = this.numa.getNumaDistance(currentNode, node.nodeNumber);
final int rawDistance = this.numa.getNumaDistance(currentNode, node.nodeNumber);
final int distance = rawDistance <= 0 ? Integer.MAX_VALUE : rawDistance;
if (distance > selectedDistance) {
continue;
}
Expand All @@ -298,7 +299,8 @@ private TickThreadRunner selectRunner(final TickThreadRunner previousRunner, fin
int selectedDistance = Integer.MAX_VALUE;

for (final NodeThreads node : nodes) {
final int distance = this.numa.getNumaDistance(currentNode, node.nodeNumber);
final int rawDistance = this.numa.getNumaDistance(currentNode, node.nodeNumber);
final int distance = rawDistance <= 0 ? Integer.MAX_VALUE : rawDistance;
for (final TickThreadRunner runner : node.threads) {
// yes the size is just a rough guess...
final int size = runner.tickQueue.size();
Expand Down Expand Up @@ -350,14 +352,14 @@ public void schedule(final SchedulableTick tick) {

@Override
public void notifyTasks(final SchedulableTick tick) {
if (tick.state instanceof ScheduledState state) {
if (tick.getState() instanceof ScheduledState state) {
state.scheduleTasks();
}
}

@Override
public boolean cancel(final SchedulableTick tick) {
if (tick.state instanceof ScheduledState state) {
if (tick.getState() instanceof ScheduledState state) {
return state.tryCancel();
} else {
return false;
Expand Down Expand Up @@ -915,7 +917,8 @@ private void tryStealTask() {
TickThreadRunner selectedRunner = null;

for (final NodeThreads node : this.nodes) {
final int distance = this.scheduler.numa.getNumaDistance(this.node.nodeNumber, node.nodeNumber);
final int rawDistance = this.scheduler.numa.getNumaDistance(this.node.nodeNumber, node.nodeNumber);
final int distance = rawDistance <= 0 ? Integer.MAX_VALUE : rawDistance;

for (final TickThreadRunner runner : node.threads) {
if (runner == this) {
Expand Down