Skip to content

Instantly share code, notes, and snippets.

View garazdawi's full-sized avatar

Lukas Larsson garazdawi

  • Erlang Solutions
  • Stockholm
View GitHub Profile
@garazdawi
garazdawi / bit_vector.erl
Last active June 9, 2023 17:42
A shared mutable bit-vector in Erlang
-module(bit_vector).
-export([new/1, get/2, set/2, clear/2, flip/2, print/1]).
new(Size) ->
Words = (Size + 63) div 64,
{?MODULE, Size, atomics:new(Words, [{signed, false}])}.
get({?MODULE, _Size, Aref}, Bix) ->
@garazdawi
garazdawi / gcount.erl
Created September 6, 2019 14:20
Global Counters in Erlang
-module(gcount).
-export([bench/0,bench/1]).
-export([ets_init/0,ets_new/1,ets_incr/1,ets_read/1]).
-export([cnt_init/0,cnt_new/1,cnt_incr/1,cnt_read/1]).
-export([cnt_pt_init/0,cnt_pt_new/1,cnt_pt_incr/1,cnt_pt_read/1]).
ets_init() ->
ets:new(?MODULE, [{write_concurrency,true},named_table,public]).
ets_new(Counter) ->
@garazdawi
garazdawi / tlsv1.3.sh
Created May 10, 2019 13:07
How to compile openssl and Erlang/OTP with TLSv1.3
#!/bin/bash
git clone https://github.com/openssl/openssl
cd openssl
git checkout OpenSSL_1_1_1b
./Configure shared --prefix=$HOME/apps/openssl/1.1.1b --openssldir=$HOME/apps/openssl/1.1.1b linux-x86_64
make
make install
cd ..
-module(gen_tcp2).
-export([listen/2, accept/1, accept/2,
connect/3, connect/4,
send/2, recv/1, recv/2, recv/3,
close/1]).
-export([run/0, run/2]).
%% Naive gen_tcp shim over the socket API
@garazdawi
garazdawi / decode.erl
Created August 3, 2018 09:53
Decode of partial erlang external term format
-module(decode).
-export([term/1]).
term(<<131,Rest/binary>>) ->
element(1,term(Rest));
%% List
term(<<108,Sz:32,Rest/binary>>) ->
{Lst, R} = lists:foldl(
fun(_, {Acc, B}) ->
@garazdawi
garazdawi / rewrite-seealso.escript
Last active March 12, 2020 15:28
rewrite-seealso
#!/usr/bin/env escript
%% -*- erlang -*-
%%! +A 1 +SDio 1 +S 1 -mode minimal
%% This script can be used to convert <seealso> to <see*>
%% Invoked like this:
%% find lib/*/doc/src system/doc/*/ erts/doc/src/ '(' -name *.xml -o -name *.xmlsrc ')' -exec ./rewrite-seealso.escript {} \;
%% You need a OTP with built documentation for this to work
main([File]) ->
io:format("Parse: ~s~n",[File]),
%% Introducing the new `apply` pattern match operand.
%% `apply` is used to delegate the handling of a match
%% to some other function including the action to be taken
%% when a successful match happens. The `apply` statement
%% replaces the "-> body" part of a function/case/receive.
%%
%% Simple example:
%% example() ->
%% Pat = fun(A) when is_atom(A) ->
%% {ok, A}
@garazdawi
garazdawi / trace_issue.escript
Created August 1, 2018 11:33 — forked from devonestes/trace_issue.escript
Reproduction escript for trace/3 wierdness
#!/usr/bin/env escript
%% -*- erlang -*-
%%! -smp enable -sname wtf
main(_) ->
process_flag(trap_exit, true),
ToMap = lists:seq(1, 50),
MapFun = fun() ->
lists:map(fun(N) -> N end, ToMap)
end,
start_runner(MapFun),
## Initial assembly
lbl_sum0: i_func_info_IaaI 0 sum sum 2
i_is_eq_exact_immed_frc f(lbl_sum1) x(0) 0
move_return_xr x(1) x(0)
lbl_sum1: is_tuple_of_arity_fxA f(lbl_sum0) x(1) 2
extract_next_element2_x x(2)
i_is_eq_exact_immed_fxc f(lbl_sum0) x(2) s
i_fetch_rc x(0) 1
i_minus_jId j(0000000000000000) 4 x(1)
i_fetch_xr x(3) x(0)
@garazdawi
garazdawi / gist:1037856
Created June 21, 2011 13:36
dialyze this!
module(test).
-export([get_data/1]).
get_data([T|Rest]) ->
case T of
test ->
do_error([T|Rest]);
_Else ->
do_error([])