···235235 end
236236237237 def handle_cast({:queue_task, pid, delay, %Send{} = send}, %State{} = state) when is_pid(pid) and is_integer(delay) do
238238+ delay =
239239+ case send.dest == pid do
240240+ true -> delay
241241+ # Minimum 10ms of latency for all messages not sent to self()
242242+ # TODO: vary this based on whether processes are on the same node
243243+ false -> max(delay, 10)
244244+ end
245245+238246 case delay do
239247 0 ->
240248 log(state, {:send_now, state.clock, send.dest, send.message})
+1-4
lib/construct/sim_server.ex
···7272 end
7373 end
74747575- # We yield on receives because the simulation has to make clock progress somewhere
7676- # (obviously we can't yield on send because send is asynchronous!)
7777- Hobbes.Construct.Scheduler.yield(unquote(scheduler_pid), 10)
7878-7575+ Hobbes.Construct.Scheduler.yield(unquote(scheduler_pid))
7976 # We first check if the message queue already has a matching message
8077 # If so, we don't want to yield_until_message because the Scheduler would
8178 # have no way of knowing that a matching message is already in our queue
+25
lib/workloads.ex
···247247 end
248248 end)
249249 end
250250+251251+ def mean([]), do: 0
252252+ def mean(numbers), do: Enum.sum(numbers) / length(numbers)
253253+254254+ def pretty_number(number) when is_integer(number) do
255255+ number
256256+ |> Integer.to_string()
257257+ |> commas()
258258+ end
259259+260260+ def pretty_number(number) when is_float(number) do
261261+ string = :erlang.float_to_binary(number, decimals: 2)
262262+ [i, f] = String.split(string, ".")
263263+ commas(i) <> "." <> f
264264+ end
265265+266266+ defp commas(number_string) when is_binary(number_string) do
267267+ number_string
268268+ |> String.to_charlist()
269269+ |> Enum.reverse()
270270+ |> Enum.chunk_every(3)
271271+ |> Enum.map(&Enum.reverse/1)
272272+ |> Enum.reverse()
273273+ |> Enum.join(",")
274274+ end
250275end