Skip to content

Commit ce9808b

Browse files
committed
binary pack option
1 parent 1093c51 commit ce9808b

File tree

4 files changed

+28
-0
lines changed

4 files changed

+28
-0
lines changed

lib/manifold.ex

+2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ defmodule Manifold do
5757
def send([pid], message, options), do: __MODULE__.send(pid, message, options)
5858

5959
def send(pids, message, options) when is_list(pids) do
60+
message = Utils.pack_message(options[:pack_mode], message)
61+
6062
case options[:send_mode] do
6163
:offload ->
6264
Sender.send(current_sender(), current_partitioner(), pids, message)

lib/manifold/utils.ex

+8
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,12 @@ defmodule Manifold.Utils do
5656

5757
hibernate_delay + :rand.uniform(hibernate_jitter)
5858
end
59+
60+
@spec pack_message(mode :: atom(), message :: term()) :: term()
61+
def pack_message(:binary, message), do: {:manifold_binary, :erlang.term_to_binary(message)}
62+
def pack_message(_mode, message), do: message
63+
64+
@spec unpack_message(message :: term()) :: term()
65+
def unpack_message({:manifold_binary, binary}), do: :erlang.binary_to_term(binary)
66+
def unpack_message(message), do: message
5967
end

lib/manifold/worker.ex

+2
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ defmodule Manifold.Worker do
1717
end
1818

1919
def handle_cast({:send, [pid], message}, nil) do
20+
message = Utils.unpack_message(message)
2021
send(pid, message)
2122
{:noreply, nil}
2223
end
2324

2425
def handle_cast({:send, pids, message}, nil) do
26+
message = Utils.unpack_message(message)
2527
for pid <- pids, do: send(pid, message)
2628
{:noreply, nil}
2729
end

test/manifold_test.exs

+16
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,22 @@ defmodule ManifoldTest do
2929
end
3030
end
3131

32+
test "pack_mode option" do
33+
me = self()
34+
message = :hello
35+
pids = for _ <- 0..10000 do
36+
spawn_link fn ->
37+
receive do
38+
message -> send(me, {self(), message})
39+
end
40+
end
41+
end
42+
Manifold.send(pids, message, pack_mode: :binary)
43+
for pid <- pids do
44+
assert_receive {^pid, ^message}, 1000
45+
end
46+
end
47+
3248
test "send to list of one" do
3349
me = self()
3450
message = :hello

0 commit comments

Comments
 (0)