diff --git a/C/init.c b/C/init.c index be6413108..9c9ae231e 100644 --- a/C/init.c +++ b/C/init.c @@ -354,6 +354,7 @@ static Opdef Ops[] = { {"dynamic", fx, 1150}, {"thread_local", fx, 1150}, {"initialization", fx, 1150}, + {"volatile", fx, 1150}, {"mode", fx, 1150}, {"public", fx, 1150}, {"multifile", fx, 1150}, diff --git a/library/dialect/swi.yap b/library/dialect/swi.yap index 8a18400ec..d4769b29a 100755 --- a/library/dialect/swi.yap +++ b/library/dialect/swi.yap @@ -203,21 +203,6 @@ predmerge(<, P, H1, H2, T1, T2, [H1|R]) :- % maybe a good idea to eventually support this in YAP. % but for now just ignore it. % -:- meta_predicate prolog:volatile(:). - -:- op(1150, fx, 'volatile'). - -prolog:volatile(P) :- var(P), - throw(error(instantiation_error,volatile(P))). -prolog:volatile(M:P) :- - do_volatile(P,M). -prolog:volatile((G1,G2)) :- - prolog:volatile(G1), - prolog:volatile(G2). -prolog:volatile(P) :- - prolog_load_context(module, M), - do_volatile(P,M). - prolog:load_foreign_library(P,Command) :- absolute_file_name(P,[file_type(executable),solutions(first),file_errors(fail)],Lib), load_foreign_files([Lib],[],Command). @@ -225,8 +210,6 @@ prolog:load_foreign_library(P,Command) :- prolog:load_foreign_library(P) :- prolog:load_foreign_library(P,install). -do_volatile(P,M) :- dynamic(M:P). - :- use_module(library(lists)). prolog:term_to_atom(Term,Atom) :- diff --git a/pl/threads.yap b/pl/threads.yap index 91fb22904..a44d039fc 100644 --- a/pl/threads.yap +++ b/pl/threads.yap @@ -21,7 +21,22 @@ thread_create(:), thread_at_exit(:), thread_signal(+,:), - with_mutex(+,:). + with_mutex(+,:), + volatile(:). + +volatile(P) :- var(P), + throw(error(instantiation_error,volatile(P))). +volatile(M:P) :- + '$do_volatile'(P,M). +volatile((G1,G2)) :- + '$do_volatile'(G1), + '$do_volatile'(G2). +volatile(P) :- + '$current_module'(M), + '$do_volatile'(P,M). + +'$do_volatile'(P,M) :- dynamic(M:P). + :- initialization('$init_thread0').