forked from Github/emacs
Compare commits
1 commit
master
...
scratch/na
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
718c56194d |
3 changed files with 26 additions and 7 deletions
|
|
@ -24,7 +24,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
|
|||
|
||||
#include "lisp.h"
|
||||
#include "keyboard.h"
|
||||
#include "syssignal.h"
|
||||
#include "systime.h"
|
||||
#include "atimer.h"
|
||||
#include <unistd.h>
|
||||
|
|
@ -71,7 +70,7 @@ enum { timerfd = -1 };
|
|||
|
||||
/* Block/unblock SIGALRM. */
|
||||
|
||||
static void
|
||||
void
|
||||
block_atimers (sigset_t *oldset)
|
||||
{
|
||||
sigset_t blocked;
|
||||
|
|
@ -80,7 +79,7 @@ block_atimers (sigset_t *oldset)
|
|||
sigaddset (&blocked, SIGINT);
|
||||
pthread_sigmask (SIG_BLOCK, &blocked, oldset);
|
||||
}
|
||||
static void
|
||||
void
|
||||
unblock_atimers (sigset_t const *oldset)
|
||||
{
|
||||
pthread_sigmask (SIG_SETMASK, oldset, 0);
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
|
|||
#define EMACS_ATIMER_H
|
||||
|
||||
#include <time.h>
|
||||
#include "syssignal.h"
|
||||
|
||||
/* Forward declaration. */
|
||||
|
||||
|
|
@ -69,6 +70,8 @@ struct atimer
|
|||
|
||||
/* Function prototypes. */
|
||||
|
||||
void block_atimers (sigset_t *);
|
||||
void unblock_atimers (sigset_t const *);
|
||||
struct atimer *start_atimer (enum atimer_type, struct timespec,
|
||||
atimer_callback, void *);
|
||||
void cancel_atimer (struct atimer *);
|
||||
|
|
|
|||
25
src/comp.c
25
src/comp.c
|
|
@ -40,6 +40,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
|
|||
#include "md5.h"
|
||||
#include "sysstdio.h"
|
||||
#include "zlib.h"
|
||||
#include "atimer.h"
|
||||
|
||||
|
||||
/********************************/
|
||||
|
|
@ -5296,10 +5297,29 @@ unset_cu_load_ongoing (Lisp_Object comp_u)
|
|||
XNATIVE_COMP_UNIT (comp_u)->load_ongoing = false;
|
||||
}
|
||||
|
||||
/* Number of native loads going on. */
|
||||
unsigned loads;
|
||||
|
||||
sigset_t oldset;
|
||||
|
||||
static void
|
||||
maybe_unblock_atimers (Lisp_Object obj)
|
||||
{
|
||||
--loads;
|
||||
if (!loads)
|
||||
unblock_atimers (&oldset);
|
||||
}
|
||||
|
||||
Lisp_Object
|
||||
load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
|
||||
bool late_load)
|
||||
{
|
||||
specpdl_ref count = SPECPDL_INDEX ();
|
||||
if (!loads)
|
||||
block_atimers (&oldset);
|
||||
++loads;
|
||||
record_unwind_protect (maybe_unblock_atimers, Qnil);
|
||||
|
||||
Lisp_Object res = Qnil;
|
||||
dynlib_handle_ptr handle = comp_u->handle;
|
||||
Lisp_Object comp_u_lisp_obj;
|
||||
|
|
@ -5336,7 +5356,6 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
|
|||
identify is we have at least another load active on it. */
|
||||
bool recursive_load = comp_u->load_ongoing;
|
||||
comp_u->load_ongoing = true;
|
||||
specpdl_ref count = SPECPDL_INDEX ();
|
||||
if (!recursive_load)
|
||||
record_unwind_protect (unset_cu_load_ongoing, comp_u_lisp_obj);
|
||||
|
||||
|
|
@ -5437,9 +5456,7 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
|
|||
eassert (check_comp_unit_relocs (comp_u));
|
||||
}
|
||||
|
||||
if (!recursive_load)
|
||||
/* Clean-up the load ongoing flag in case. */
|
||||
unbind_to (count, Qnil);
|
||||
unbind_to (count, Qnil);
|
||||
|
||||
register_native_comp_unit (comp_u_lisp_obj);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue