[erlang-questions] How to debug dirty NIF?

Max Lapshin max.lapshin@REDACTED
Thu Aug 28 17:19:24 CEST 2014

I'm running CPU bound task (make thumbnails from video) in a NIF under
 erlang 17 (erts 6.0)

I'm using dirty nif scheduling:

yuv2jpeg0(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {

async_jpeg(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
  ERL_NIF_TERM result = yuv2jpeg0(env, argc, argv);
  return enif_schedule_dirty_nif_finalizer(env, result,

yuv2jpeg(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
  return enif_schedule_dirty_nif(env, ERL_NIF_DIRTY_JOB_CPU_BOUND,
async_jpeg, argc, argv);

I see strange situation: none of CPU core is not 100% loaded, but processes
that are calling yuv2jpeg function are hanging in this function:

(flussonic@REDACTED)3> process_info(pid(0,961,0)).








I suppose that I could meet the old problem with wrong scheduler behaviour
when NIF is using thread for too long.

yuv2jpeg takes usually about 2-4 milliseconds to run.

Is it possible to debug this situation? Can I somehow ask erlang if it
decided that some scheduler is considered idle?

I launch erlang so:

erlang/erts-6.0/bin/beam.smp -K true -Bi -A 100 -a 32 -stbt s -MBas
aoffcaobf -MBacul 0
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20140828/a89d21a7/attachment.htm>

More information about the erlang-questions mailing list