aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/test/nif_SUITE_data/nif_mod.h
blob: fb14fee8150d236bd2b225784a46f4de02567944 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
typedef struct call_info_t
{
    struct call_info_t* next;
    unsigned lib_ver;
    int static_cntA;
    int static_cntB;
    char* arg;
    int arg_sz;
    char func_name[1]; /* must be last */
}CallInfo;

#define RT_MAX 5

typedef struct
{
    ErlNifMutex* mtx;
    int ref_cnt;
    CallInfo* call_history;
    ErlNifResourceType* rt_arr[RT_MAX];
}NifModPrivData;

#define NifModPrivData_release(NMPD) \
    do { \
	int is_last; \
	enif_mutex_lock((NMPD)->mtx); \
	is_last = (--(NMPD)->ref_cnt == 0); \
        enif_mutex_unlock((NMPD)->mtx); \
        if (is_last) { \
	    enif_mutex_destroy((NMPD)->mtx); \
	    while ((NMPD)->call_history) { \
	        CallInfo* next = (NMPD)->call_history->next; \
		enif_free((NMPD)->call_history); \
		(NMPD)->call_history = next; \
	    } \
	    enif_free((NMPD)); \
        } \
    }while (0)