本文整理汇总了C++中erl_exit函数的典型用法代码示例。如果您正苦于以下问题:C++ erl_exit函数的具体用法?C++ erl_exit怎么用?C++ erl_exit使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了erl_exit函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: posix_clock_gettime_times
static ERTS_INLINE void
posix_clock_gettime_times(clockid_t mid, char *mname,
ErtsMonotonicTime *mtimep,
clockid_t sid, char *sname,
ErtsSystemTime *stimep)
{
struct timespec mts, sts;
int mres, sres, merr, serr;
mres = clock_gettime(mid, &mts);
merr = errno;
sres = clock_gettime(sid, &sts);
serr = errno;
if (mres != 0) {
char *errstr = merr ? strerror(merr) : "unknown";
erl_exit(ERTS_ABORT_EXIT,
"clock_gettime(%s, _) failed: %s (%d)\n",
mname, errstr, merr);
}
if (sres != 0) {
char *errstr = serr ? strerror(serr) : "unknown";
erl_exit(ERTS_ABORT_EXIT,
"clock_gettime(%s, _) failed: %s (%d)\n",
sname, errstr, serr);
}
*mtimep = (ErtsMonotonicTime) ERTS_TimeSpec2Sint64(&mts);
*stimep = (ErtsSystemTime) ERTS_TimeSpec2Sint64(&sts);
}
开发者ID:Dasudian,项目名称:otp,代码行数:30,代码来源:sys_time.c
示例2: erts_check_memory
void erts_check_memory(Process *p, Eterm *start, Eterm *end)
{
Eterm *pos = start;
while (pos < end) {
Eterm hval = *pos++;
#ifdef DEBUG
if (hval == DEBUG_BAD_WORD) {
print_untagged_memory(start, end);
erl_exit(1, "Uninitialized HAlloc'ed memory found @ 0x%0*lx!\n",
PTR_SIZE,(unsigned long)(pos - 1));
}
#endif
if (is_thing(hval)) {
pos += thing_arityval(hval);
continue;
}
if (verify_eterm(p,hval))
continue;
erl_exit(1, "Wild pointer found @ 0x%0*lx!\n",
PTR_SIZE,(unsigned long)(pos - 1));
}
}
开发者ID:colin3dmax,项目名称:otp,代码行数:27,代码来源:erl_debug.c
示例3: load_preloaded
static void
load_preloaded(void)
{
int i;
Eterm res;
Preload* preload_p;
Eterm module_name;
byte* code;
char* name;
int length;
if ((preload_p = sys_preloaded()) == NULL) {
return;
}
i = 0;
while ((name = preload_p[i].name) != NULL) {
length = preload_p[i].size;
module_name = am_atom_put(name, sys_strlen(name));
if ((code = sys_preload_begin(&preload_p[i])) == 0)
erl_exit(1, "Failed to find preloaded code for module %s\n",
name);
res = erts_preload_module(NULL, 0, NIL, &module_name, code, length);
sys_preload_end(&preload_p[i]);
if (res != NIL)
erl_exit(1,"Failed loading preloaded module %s (%T)\n",
name, res);
i++;
}
}
开发者ID:DavidPajaro,项目名称:otp,代码行数:29,代码来源:erl_init.c
示例4: erts_check_stack
void erts_check_stack(Process *p)
{
Eterm *elemp;
Eterm *stack_start = p->heap + p->heap_sz;
Eterm *stack_end = p->htop;
if (p->stop > stack_start)
erl_exit(1,
"<%lu.%lu.%lu>: Stack underflow\n",
internal_pid_channel_no(p->common.id),
internal_pid_number(p->common.id),
internal_pid_serial(p->common.id));
if (p->stop < stack_end)
erl_exit(1,
"<%lu.%lu.%lu>: Stack overflow\n",
internal_pid_channel_no(p->common.id),
internal_pid_number(p->common.id),
internal_pid_serial(p->common.id));
for (elemp = p->stop; elemp < stack_start; elemp++) {
int in_mbuf = 0;
Eterm *ptr;
ErlHeapFragment* mbuf;
switch (primary_tag(*elemp)) {
case TAG_PRIMARY_LIST:
ptr = list_val(*elemp);
break;
case TAG_PRIMARY_BOXED:
ptr = boxed_val(*elemp);
break;
default: /* Immediate or cp */
continue;
}
if (IN_HEAP(p, ptr))
continue;
for (mbuf = p->mbuf; mbuf; mbuf = mbuf->next)
if (WITHIN(ptr, &mbuf->mem[0], &mbuf->mem[0] + mbuf->used_size)) {
in_mbuf = 1;
break;
}
if (in_mbuf)
continue;
erl_exit(1,
"<%lu.%lu.%lu>: Wild stack pointer\n",
internal_pid_channel_no(p->common.id),
internal_pid_number(p->common.id),
internal_pid_serial(p->common.id));
}
}
开发者ID:ritics,项目名称:otp,代码行数:52,代码来源:erl_debug.c
示例5: info_options
static Eterm
info_options(Allctr_t *allctr,
char *prefix,
int *print_to_p,
void *print_to_arg,
Uint **hpp,
Uint *szp)
{
BFAllctr_t *bfallctr = (BFAllctr_t *) allctr;
Eterm res = THE_NON_VALUE;
if (print_to_p) {
erts_print(*print_to_p,
print_to_arg,
"%sas: %s\n",
prefix,
bfallctr->address_order ? "aobf" : "bf");
}
if (hpp || szp) {
if (!atoms_initialized)
erl_exit(1, "%s:%d: Internal error: Atoms not initialized",
__FILE__, __LINE__);;
res = NIL;
add_2tup(hpp, szp, &res,
am.as,
bfallctr->address_order ? am.aobf : am.bf);
}
return res;
}
开发者ID:Argger,项目名称:otp,代码行数:33,代码来源:erl_bestfit_alloc.c
示例6: erts_add_monitor
void erts_add_monitor(ErtsMonitor **root, Uint type, Eterm ref, Eterm pid,
Eterm name)
{
void *tstack[STACK_NEED];
int tpos = 0;
int dstack[STACK_NEED+1];
int dpos = 1;
int state = 0;
ErtsMonitor **this = root;
Sint c;
dstack[0] = DIR_END;
for (;;) {
if (!*this) { /* Found our place */
state = 1;
*this = create_monitor(type,ref,pid,name);
break;
} else if ((c = CMP_MON_REF(ref,(*this)->ref)) < 0) {
/* go left */
dstack[dpos++] = DIR_LEFT;
tstack[tpos++] = this;
this = &((*this)->left);
} else if (c > 0) { /* go right */
dstack[dpos++] = DIR_RIGHT;
tstack[tpos++] = this;
this = &((*this)->right);
} else { /* Equal key is an error for monitors */
erl_exit(1,"Insertion of already present monitor!");
break;
}
}
insertion_rotation(dstack, dpos, tstack, tpos, state);
}
开发者ID:DavidAlphaFox,项目名称:my_otp,代码行数:33,代码来源:erl_monitors.c
示例7: pd_check
static void pd_check(ProcDict *pd)
{
unsigned int i;
Uint num;
if (pd == NULL)
return;
ASSERT(pd->size >= pd->used);
ASSERT(HASH_RANGE(pd) <= MAX_HASH);
for (i = 0, num = 0; i < pd->used; ++i) {
Eterm t = pd->data[i];
if (is_nil(t)) {
continue;
} else if (is_tuple(t)) {
++num;
ASSERT(arityval(*tuple_val(t)) == 2);
continue;
} else if (is_list(t)) {
while (t != NIL) {
++num;
ASSERT(is_tuple(TCAR(t)));
ASSERT(arityval(*(tuple_val(TCAR(t)))) == 2);
t = TCDR(t);
}
continue;
} else {
erl_exit(1,
"Found tag 0x%08x in process dictionary at position %d",
(unsigned long) t, (int) i);
}
}
ASSERT(num == pd->numElements);
ASSERT(pd->splitPosition <= pd->homeSize);
}
开发者ID:NaughtyCode,项目名称:otp,代码行数:33,代码来源:erl_process_dict.c
示例8: http_bld_uri
static Eterm http_bld_uri(struct packet_callback_args* pca,
Eterm** hpp, Uint* szp, const PacketHttpURI* uri)
{
Eterm s1, s2;
if (uri->type == URI_STAR) {
return am_Times; /* '*' */
}
s1 = http_bld_string(pca, hpp, szp, uri->s1_ptr, uri->s1_len);
switch (uri->type) {
case URI_ABS_PATH:
return erts_bld_tuple(hpp, szp, 2, am_abs_path, s1);
case URI_HTTP:
case URI_HTTPS:
s2 = http_bld_string(pca, hpp, szp, uri->s2_ptr, uri->s2_len);
return erts_bld_tuple
(hpp, szp, 5, am_absoluteURI,
((uri->type==URI_HTTP) ? am_http : am_https),
s1,
((uri->port==0) ? am_undefined : make_small(uri->port)),
s2);
case URI_STRING:
return s1;
case URI_SCHEME:
s2 = http_bld_string(pca, hpp, szp, uri->s2_ptr, uri->s2_len);
return erts_bld_tuple(hpp, szp, 3, am_scheme, s1, s2);
default:
erl_exit(1, "%s, line %d: type=%u\n", __FILE__, __LINE__, uri->type);
}
}
开发者ID:Oregionality,项目名称:otp,代码行数:33,代码来源:erl_bif_port.c
示例9: info_options
static Eterm
info_options(Allctr_t *allctr,
char *prefix,
int *print_to_p,
void *print_to_arg,
Uint **hpp,
Uint *szp)
{
GFAllctr_t *gfallctr = (GFAllctr_t *) allctr;
Eterm res = THE_NON_VALUE;
if (print_to_p) {
erts_print(*print_to_p,
print_to_arg,
"%smbsd: %lu\n"
"%sas: gf\n",
prefix, gfallctr->max_blk_search,
prefix);
}
if (hpp || szp) {
if (!atoms_initialized)
erl_exit(1, "%s:%d: Internal error: Atoms not initialized",
__FILE__, __LINE__);;
res = NIL;
add_2tup(hpp, szp, &res, am.as, am.gf);
add_2tup(hpp, szp, &res,
am.mbsd,
bld_uint(hpp, szp, gfallctr->max_blk_search));
}
return res;
}
开发者ID:Bufias,项目名称:otp,代码行数:35,代码来源:erl_goodfit_alloc.c
示例10: hash_init
/*
** init a pre allocated or static hash structure
** and allocate buckets.
*/
Hash* hash_init(ErtsAlcType_t type, Hash* h, char* name, int size, HashFunctions fun)
{
int sz;
int ix = 0;
h->type = type;
while (h_size_table[ix] != -1 && h_size_table[ix] < size)
ix++;
if (h_size_table[ix] == -1)
erl_exit(1, "panic: too large hash table size (%d)\n", size);
size = h_size_table[ix];
sz = size*sizeof(HashBucket*);
h->bucket = (HashBucket**) erts_alloc(h->type, sz);
sys_memzero(h->bucket, sz);
h->is_allocated = 0;
h->name = name;
h->fun = fun;
h->size = size;
h->size20percent = h->size/5;
h->size80percent = (4*h->size)/5;
h->ix = ix;
h->used = 0;
return h;
}
开发者ID:system,项目名称:erlang-otp,代码行数:32,代码来源:hash.c
示例11: info_options
static Eterm
info_options(Allctr_t *allctr,
char *prefix,
int *print_to_p,
void *print_to_arg,
Uint **hpp,
Uint *szp)
{
Eterm res = THE_NON_VALUE;
if (print_to_p) {
erts_print(*print_to_p, print_to_arg, "%sas: af\n", prefix);
}
if (hpp || szp) {
if (!atoms_initialized)
erl_exit(1, "%s:%d: Internal error: Atoms not initialized",
__FILE__, __LINE__);;
res = NIL;
add_2tup(hpp, szp, &res, am.as, am.af);
}
return res;
}
开发者ID:system,项目名称:erlang-otp,代码行数:26,代码来源:erl_afit_alloc.c
示例12: erts_pd_hash_get
Eterm erts_pd_hash_get(Process *p, Eterm id)
{
unsigned int hval;
Eterm tmp;
ProcDict *pd = p->dictionary;
if (pd == NULL)
return am_undefined;
hval = pd_hash_value(pd, id);
tmp = ARRAY_GET(pd, hval);
if (is_boxed(tmp)) { /* Tuple */
ASSERT(is_tuple(tmp));
if (EQ(tuple_val(tmp)[1], id)) {
return tuple_val(tmp)[2];
}
} else if (is_list(tmp)) {
for (; tmp != NIL && !EQ(tuple_val(TCAR(tmp))[1], id); tmp = TCDR(tmp)) {
;
}
if (tmp != NIL) {
return tuple_val(TCAR(tmp))[2];
}
} else if (is_not_nil(tmp)) {
#ifdef DEBUG
erts_fprintf(stderr,
"Process dictionary for process %T is broken, trying to "
"display term found in line %d:\n"
"%T\n", p->common.id, __LINE__, tmp);
#endif
erl_exit(1, "Damaged process dictionary found during get/1.");
}
return am_undefined;
}
开发者ID:NaughtyCode,项目名称:otp,代码行数:33,代码来源:erl_process_dict.c
示例13: erts_init_time
/* this routine links the time cells into a free list at the start
and sets the time queue as empty */
void
erts_init_time(void)
{
int i, itime;
/* system dependent init; must be done before do_time_init()
if timer thread is enabled */
itime = erts_init_time_sup();
#ifdef TIW_ITIME_IS_CONSTANT
if (itime != TIW_ITIME) {
erl_exit(ERTS_ABORT_EXIT, "timer resolution mismatch %d != %d", itime, TIW_ITIME);
}
#else
tiw_itime = itime;
#endif
erts_smp_mtx_init(&tiw_lock, "timer_wheel");
tiw = (ErlTimer**) erts_alloc(ERTS_ALC_T_TIMER_WHEEL,
TIW_SIZE * sizeof(ErlTimer*));
for(i = 0; i < TIW_SIZE; i++)
tiw[i] = NULL;
do_time_init();
tiw_pos = tiw_nto = 0;
tiw_min_ptr = NULL;
tiw_min = 0;
}
开发者ID:1153,项目名称:otp,代码行数:29,代码来源:time.c
示例14: get_tolerant_timeofday
static void get_tolerant_timeofday(SysTimeval *tv)
{
SysHrTime diff_time, curr;
if (erts_disable_tolerant_timeofday) {
sys_gettimeofday(tv);
return;
}
*tv = inittv;
diff_time = ((curr = sys_gethrtime()) + hr_correction - hr_init_time) / 1000;
if (curr < hr_init_time) {
erl_exit(1,"Unexpected behaviour from operating system high "
"resolution timer");
}
if ((curr - hr_last_correction_check) / 1000 > 1000000) {
/* Check the correction need */
SysHrTime tv_diff, diffdiff;
SysTimeval tmp;
int done = 0;
sys_gettimeofday(&tmp);
tv_diff = ((SysHrTime) tmp.tv_sec) * 1000000 + tmp.tv_usec;
tv_diff -= ((SysHrTime) inittv.tv_sec) * 1000000 + inittv.tv_usec;
diffdiff = diff_time - tv_diff;
if (diffdiff > 10000) {
SysHrTime corr = (curr - hr_last_time) / 100;
if (corr / 1000 >= diffdiff) {
++done;
hr_correction -= ((SysHrTime)diffdiff) * 1000;
} else {
hr_correction -= corr;
}
diff_time = (curr + hr_correction - hr_init_time) / 1000;
} else if (diffdiff < -10000) {
SysHrTime corr = (curr - hr_last_time) / 100;
if (corr / 1000 >= -diffdiff) {
++done;
hr_correction -= ((SysHrTime)diffdiff) * 1000;
} else {
hr_correction += corr;
}
diff_time = (curr + hr_correction - hr_init_time) / 1000;
} else {
++done;
}
if (done) {
hr_last_correction_check = curr;
}
}
tv->tv_sec += (int) (diff_time / ((SysHrTime) 1000000));
tv->tv_usec += (int) (diff_time % ((SysHrTime) 1000000));
if (tv->tv_usec >= 1000000) {
tv->tv_usec -= 1000000;
tv->tv_sec += 1;
}
hr_last_time = curr;
}
开发者ID:Gustav-Simonsson,项目名称:otp,代码行数:59,代码来源:erl_time_sup.c
示例15: erts_thr_q_destroy
ErtsThrQCleanState_t
erts_thr_q_destroy(ErtsThrQ_t *q)
{
if (!q->q.blk)
erl_exit(ERTS_ABORT_EXIT,
"Trying to destroy not created thread queue\n");
return erts_thr_q_finalize(q);
}
开发者ID:0x00evil,项目名称:otp,代码行数:8,代码来源:erl_thr_queue.c
示例16: export_alloc
static struct export_entry*
export_alloc(struct export_entry* tmpl_e)
{
#ifndef ERTS_SLAVE
struct export_blob* blob;
unsigned ix;
if (tmpl_e->slot.index == -1) { /* Template, allocate blob */
Export* tmpl = tmpl_e->ep;
Export* obj;
blob = (struct export_blob*) erts_alloc(ERTS_ALC_T_EXPORT, sizeof(*blob));
erts_smp_atomic_add_nob(&total_entries_bytes, sizeof(*blob));
obj = &blob->exp;
obj->fake_op_func_info_for_hipe[0] = 0;
obj->fake_op_func_info_for_hipe[1] = 0;
obj->code[0] = tmpl->code[0];
obj->code[1] = tmpl->code[1];
obj->code[2] = tmpl->code[2];
obj->code[3] = (BeamInstr) em_call_error_handler;
obj->code[4] = 0;
#ifdef ERTS_SLAVE_EMU_ENABLED
obj->slave_fake_op_func_info_for_hipe[0] = 0;
obj->slave_fake_op_func_info_for_hipe[1] = 0;
obj->slave_code[0] = tmpl->code[0];
obj->slave_code[1] = tmpl->code[1];
obj->slave_code[2] = tmpl->code[2];
/* If the slave is not online yet, we don't know its opcodes.
* slave_code[3] will be touched on all export entries once it comes
* online */
if (slave_initialised)
obj->slave_code[3] = (BeamInstr) SlaveOp(op_call_error_handler);
obj->slave_code[4] = 0;
#endif
for (ix=0; ix<ERTS_NUM_CODE_IX; ix++) {
obj->addressv[ix] = obj->code+3;
#ifdef ERTS_SLAVE_EMU_ENABLED
obj->slave_addressv[ix] = obj->slave_code+3;
#endif
blob->entryv[ix].slot.index = -1;
blob->entryv[ix].ep = &blob->exp;
}
ix = 0;
}
else { /* Existing entry in another table, use free entry in blob */
blob = entry_to_blob(tmpl_e);
for (ix = 0; blob->entryv[ix].slot.index >= 0; ix++) {
ASSERT(ix < ERTS_NUM_CODE_IX);
}
}
return &blob->entryv[ix];
#else
erl_exit(1, "Cannot alloc export entry from slave");
#endif
}
开发者ID:margnus1,项目名称:otp,代码行数:58,代码来源:export.c
示例17: mach_clocks_init
static void
mach_clocks_init(void)
{
kern_return_t kret;
host_name_port_t host;
clock_id_t id;
clock_serv_t *clck_srv_p;
char *name;
host = internal_state.r.o.mach.host = mach_host_self();
#if defined(OS_MONOTONIC_TIME_USING_MACH_CLOCK_GET_TIME) \
|| defined(SYS_HRTIME_USING_MACH_CLOCK_GET_TIME)
id = internal_state.r.o.mach.clock.monotonic.id = MONOTONIC_CLOCK_ID;
name = internal_state.r.o.mach.clock.monotonic.name = MONOTONIC_CLOCK_ID_STR;
clck_srv_p = &internal_state.r.o.mach.clock.monotonic.srv;
kret = host_get_clock_service(host, id, clck_srv_p);
if (kret != KERN_SUCCESS) {
erl_exit(ERTS_ABORT_EXIT,
"host_get_clock_service(_, %s, _) failed\n",
name);
}
#endif
#if defined(OS_SYSTEM_TIME_USING_MACH_CLOCK_GET_TIME)
id = internal_state.r.o.mach.clock.wall.id = WALL_CLOCK_ID;
name = internal_state.r.o.mach.clock.wall.name = WALL_CLOCK_ID_STR;
clck_srv_p = &internal_state.r.o.mach.clock.wall.srv;
kret = host_get_clock_service(host, id, clck_srv_p);
if (kret != KERN_SUCCESS) {
erl_exit(ERTS_ABORT_EXIT,
"host_get_clock_service(_, %s, _) failed\n",
name);
}
#endif
if (atexit(mach_clocks_fini) != 0) {
int err = errno;
char *errstr = err ? strerror(err) : "unknown";
erl_exit(ERTS_ABORT_EXIT,
"Failed to register mach_clocks_fini() "
"for call at exit: %s (%d)\n",
errstr, err);
}
}
开发者ID:Dasudian,项目名称:otp,代码行数:45,代码来源:sys_time.c
示例18: process_killer
static void
process_killer(void)
{
int i, j, max = erts_ptab_max(&erts_proc);
Process* rp;
erts_printf("\n\nProcess Information\n\n");
erts_printf("--------------------------------------------------\n");
for (i = max-1; i >= 0; i--) {
rp = erts_pix2proc(i);
if (rp && rp->i != ENULL) {
int br;
print_process_info(ERTS_PRINT_STDOUT, NULL, rp);
erts_printf("(k)ill (n)ext (r)eturn:\n");
while(1) {
if ((j = sys_get_key(0)) <= 0)
erl_exit(0, "");
switch(j) {
case 'k': {
ErtsProcLocks rp_locks = ERTS_PROC_LOCKS_XSIG_SEND;
erts_aint32_t state;
erts_proc_inc_refc(rp);
erts_smp_proc_lock(rp, rp_locks);
state = erts_smp_atomic32_read_acqb(&rp->state);
if (state & (ERTS_PSFLG_FREE
| ERTS_PSFLG_EXITING
| ERTS_PSFLG_ACTIVE
| ERTS_PSFLG_ACTIVE_SYS
| ERTS_PSFLG_IN_RUNQ
| ERTS_PSFLG_RUNNING
| ERTS_PSFLG_RUNNING_SYS)) {
erts_printf("Can only kill WAITING processes this way\n");
}
else {
(void) erts_send_exit_signal(NULL,
NIL,
rp,
&rp_locks,
am_kill,
NIL,
NULL,
0);
}
erts_smp_proc_unlock(rp, rp_locks);
erts_proc_dec_refc(rp);
}
case 'n': br = 1; break;
case 'r': return;
default: return;
}
if (br == 1) break;
}
}
}
}
开发者ID:easemob,项目名称:otp,代码行数:55,代码来源:break.c
示例19: os_putenv_2
Eterm
os_putenv_2(Process* p, Eterm key, Eterm value)
{
char def_buf[1024];
char *buf = NULL;
int sep_ix, i, key_len, value_len, tot_len;
key_len = is_string(key);
if (!key_len) {
error:
if (buf)
erts_free(ERTS_ALC_T_TMP, (void *) buf);
BIF_ERROR(p, BADARG);
}
if (is_nil(value))
value_len = 0;
else {
value_len = is_string(value);
if (!value_len)
goto error;
}
tot_len = key_len + 1 + value_len + 1;
if (tot_len <= sizeof(def_buf))
buf = &def_buf[0];
else
buf = erts_alloc(ERTS_ALC_T_TMP, tot_len);
i = intlist_to_buf(key, buf, key_len);
if (i != key_len)
erl_exit(1, "%s:%d: Internal error\n", __FILE__, __LINE__);
sep_ix = i;
buf[i++] = '=';
if (is_not_nil(value))
i += intlist_to_buf(value, &buf[i], value_len);
if (i != key_len + 1 + value_len)
erl_exit(1, "%s:%d: Internal error\n", __FILE__, __LINE__);
buf[i] = '\0';
if (erts_sys_putenv(buf, sep_ix)) {
goto error;
}
if (buf != &def_buf[0])
erts_free(ERTS_ALC_T_TMP, (void *) buf);
BIF_RET(am_true);
}
开发者ID:ask,项目名称:erlang-otp,代码行数:42,代码来源:erl_bif_os.c
示例20: os_getenv_1
Eterm
os_getenv_1(Process* p, Eterm key)
{
Eterm str;
int len, res;
char *key_str, *val;
char buf[1024];
size_t val_size = sizeof(buf);
len = is_string(key);
if (!len) {
BIF_ERROR(p, BADARG);
}
/* Leave at least one byte in buf for value */
key_str = len < sizeof(buf)-2 ? &buf[0] : erts_alloc(ERTS_ALC_T_TMP, len+1);
if (intlist_to_buf(key, key_str, len) != len)
erl_exit(1, "%s:%d: Internal error\n", __FILE__, __LINE__);
key_str[len] = '\0';
if (key_str != &buf[0])
val = &buf[0];
else {
val_size -= len + 1;
val = &buf[len + 1];
}
res = erts_sys_getenv(key_str, val, &val_size);
if (res < 0) {
no_var:
str = am_false;
} else {
Eterm* hp;
if (res > 0) {
val = erts_alloc(ERTS_ALC_T_TMP, val_size);
while (1) {
res = erts_sys_getenv(key_str, val, &val_size);
if (res == 0)
break;
else if (res < 0)
goto no_var;
else
val = erts_realloc(ERTS_ALC_T_TMP, val, val_size);
}
}
if (val_size)
hp = HAlloc(p, val_size*2);
str = buf_to_intlist(&hp, val, val_size, NIL);
}
if (key_str != &buf[0])
erts_free(ERTS_ALC_T_TMP, key_str);
if (val < &buf[0] || &buf[sizeof(buf)-1] < val)
erts_free(ERTS_ALC_T_TMP, val);
BIF_RET(str);
}
开发者ID:ask,项目名称:erlang-otp,代码行数:54,代码来源:erl_bif_os.c
注:本文中的erl_exit函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论