diff options
author | Micael Karlberg <[email protected]> | 2011-04-18 15:14:36 +0200 |
---|---|---|
committer | Micael Karlberg <[email protected]> | 2011-04-18 15:14:36 +0200 |
commit | 5af51d9dcb60487e4fcc87353fe0e150c0ba9eed (patch) | |
tree | 95eb7adb0edba96eb3fc362a519fb1508cb477ec /erts/emulator/beam/bif.c | |
parent | d621b2cdd09adcc38bd6d482ae6c4f87e22cb1e8 (diff) | |
parent | 23906a01725f4494b8816c242926d08aeca0ef67 (diff) | |
download | otp-5af51d9dcb60487e4fcc87353fe0e150c0ba9eed.tar.gz otp-5af51d9dcb60487e4fcc87353fe0e150c0ba9eed.tar.bz2 otp-5af51d9dcb60487e4fcc87353fe0e150c0ba9eed.zip |
Merge branch 'dev' into bmk/snmp/agent/multi_engine_id_for_traps/OTP-9119
Diffstat (limited to 'erts/emulator/beam/bif.c')
-rw-r--r-- | erts/emulator/beam/bif.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c index bb237e378a..6b1ce823cb 100644 --- a/erts/emulator/beam/bif.c +++ b/erts/emulator/beam/bif.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1996-2010. All Rights Reserved. + * Copyright Ericsson AB 1996-2011. 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 @@ -368,7 +368,6 @@ static int demonitor(Process *c_p, Eterm ref) ErtsMonitor *mon = NULL; /* The monitor entry to delete */ Process *rp; /* Local target process */ Eterm to = NIL; /* Monitor link traget */ - Eterm ref_p; /* Pid of this end */ DistEntry *dep = NULL; /* Target's distribution entry */ int deref_de = 0; int res; @@ -381,7 +380,6 @@ static int demonitor(Process *c_p, Eterm ref) res = ERTS_DEMONITOR_BADARG; goto done; /* Cannot be this monitor's ref */ } - ref_p = c_p->id; mon = erts_lookup_monitor(c_p->monitors, ref); if (!mon) { @@ -1091,10 +1089,20 @@ BIF_RETTYPE unlink_1(BIF_ALIST_1) BIF_RETTYPE hibernate_3(BIF_ALIST_3) { /* - * hibernate/3 is implemented as an instruction; therefore - * this function will never be called. + * hibernate/3 is usually translated to an instruction; therefore + * this function is only called from HiPE or when the call could not + * be translated. */ - BIF_ERROR(BIF_P, BADARG); + Eterm reg[3]; + + if (erts_hibernate(BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3, reg)) { + /* + * If hibernate succeeded, TRAP. The process will be suspended + * if status is P_WAITING or continue (if any message was in the queue). + */ + BIF_TRAP_CODE_PTR_(BIF_P, BIF_P->i); + } + return THE_NON_VALUE; } /**********************************************************************/ |