in ext/mmap/mmap.c [1859:1881]
static VALUE mm_bang_i(VALUE obj, int flag, ID id, int argc, VALUE *argv) {
VALUE res;
mm_ipc *i_mm;
mm_bang bang_st;
GetMmap(obj, i_mm, 0);
if ((flag & MM_CHANGE) && (i_mm->t->flag & MM_FIXED)) {
rb_raise(rb_eTypeError, "try to change the size of a fixed map");
}
bang_st.obj = obj;
bang_st.flag = flag;
bang_st.id = id;
bang_st.argc = argc;
bang_st.argv = argv;
if (i_mm->t->flag & MM_IPC) {
mm_lock(i_mm, Qtrue);
res = rb_ensure(mm_i_bang, (VALUE)&bang_st, mm_vunlock, obj);
} else {
res = mm_i_bang(&bang_st);
}
if (res == Qnil) return res;
return (flag & MM_ORIGIN) ? res : obj;
}