/* * %CopyrightBegin% * * Copyright Ericsson AB 2009-2010. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in * compliance with the License. You should have received a copy of the * Erlang Public License along with this software. If not, it can be * retrieved online at http://www.erlang.org/. * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * %CopyrightEnd% */ /* Include file for writers of Native Implemented Functions. */ #ifndef __ERL_NIF_H__ #define __ERL_NIF_H__ #include "erl_drv_nif.h" /* Version history: ** 0.1: R13B03 ** 1.0: R13B04 */ #define ERL_NIF_MAJOR_VERSION 1 #define ERL_NIF_MINOR_VERSION 0 #include <stdlib.h> typedef unsigned long ERL_NIF_TERM; struct enif_environment_t; typedef struct enif_environment_t ErlNifEnv; typedef struct { const char* name; unsigned arity; ERL_NIF_TERM (*fptr)(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); }ErlNifFunc; typedef struct enif_entry_t { int major; int minor; const char* name; int num_of_funcs; ErlNifFunc* funcs; int (*load) (ErlNifEnv*, void** priv_data, ERL_NIF_TERM load_info); int (*reload) (ErlNifEnv*, void** priv_data, ERL_NIF_TERM load_info); int (*upgrade)(ErlNifEnv*, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info); void (*unload) (ErlNifEnv*, void* priv_data); }ErlNifEntry; typedef struct { unsigned size; unsigned char* data; /* Internals (avert your eyes) */ ERL_NIF_TERM bin_term; void* ref_bin; }ErlNifBinary; typedef struct enif_resource_type_t ErlNifResourceType; typedef void ErlNifResourceDtor(ErlNifEnv*, void*); enum ErlNifResourceFlags { ERL_NIF_RT_CREATE = 1, ERL_NIF_RT_TAKEOVER = 2 }; typedef enum { ERL_NIF_LATIN1 = 1 }ErlNifCharEncoding; typedef ErlDrvSysInfo ErlNifSysInfo; typedef struct ErlDrvTid_ *ErlNifTid; typedef struct ErlDrvMutex_ ErlNifMutex; typedef struct ErlDrvCond_ ErlNifCond; typedef struct ErlDrvRWLock_ ErlNifRWLock; typedef int ErlNifTSDKey; typedef ErlDrvThreadOpts ErlNifThreadOpts; #if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_)) # define ERL_NIF_API_FUNC_DECL(RET_TYPE, NAME, ARGS) RET_TYPE (*NAME) ARGS typedef struct { # include "erl_nif_api_funcs.h" } TWinDynNifCallbacks; extern TWinDynNifCallbacks WinDynNifCallbacks; # undef ERL_NIF_API_FUNC_DECL #endif #if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_)) && !defined(STATIC_ERLANG_DRIVER) # define ERL_NIF_API_FUNC_MACRO(NAME) (WinDynNifCallbacks.NAME) # include "erl_nif_api_funcs.h" /* note that we have to keep ERL_NIF_API_FUNC_MACRO defined */ #else /* non windows or included from emulator itself */ # define ERL_NIF_API_FUNC_DECL(RET_TYPE, NAME, ARGS) extern RET_TYPE NAME ARGS # include "erl_nif_api_funcs.h" # undef ERL_NIF_API_FUNC_DECL #endif #if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_)) # define ERL_NIF_INIT_GLOB TWinDynNifCallbacks WinDynNifCallbacks; # define ERL_NIF_INIT_DECL(MODNAME) __declspec(dllexport) ErlNifEntry* nif_init(TWinDynNifCallbacks* callbacks) # define ERL_NIF_INIT_BODY memcpy(&WinDynNifCallbacks,callbacks,sizeof(TWinDynNifCallbacks)) #else # define ERL_NIF_INIT_GLOB # define ERL_NIF_INIT_BODY # if defined(VXWORKS) # define ERL_NIF_INIT_DECL(MODNAME) ErlNifEntry* MODNAME ## _init(void) # else # define ERL_NIF_INIT_DECL(MODNAME) ErlNifEntry* nif_init(void) # endif #endif #define ERL_NIF_INIT(NAME, FUNCS, LOAD, RELOAD, UPGRADE, UNLOAD) \ ERL_NIF_INIT_GLOB \ ERL_NIF_INIT_DECL(NAME) \ { \ static ErlNifEntry entry = \ { \ ERL_NIF_MAJOR_VERSION, \ ERL_NIF_MINOR_VERSION, \ #NAME, \ sizeof(FUNCS) / sizeof(*FUNCS), \ FUNCS, \ LOAD, RELOAD, UPGRADE, UNLOAD \ }; \ ERL_NIF_INIT_BODY; \ return &entry; \ } #endif /* __ERL_NIF_H__ */