18static char SccsId[] =
"%W% %G%";
36#ifdef LOW_LEVEL_TRACER
45#if defined(YAPOR) || defined(TABLING)
58#include <stdnoreturn.h>
63Atom AtomFoundVar, AtomFreeTerm, AtomNil, AtomDot;
66bool Yap_Embedded =
false;
68int Yap_output_msg = FALSE;
69const char *Yap_BOOTFILE;
72#define LOGFILE "logfile"
75static void InTTYLine(
char *);
78static void SetOp(
int,
int,
char *, Term);
79static void InitOps(
void);
80static void InitDebug(
void);
81static void CleanBack(
PredEntry *, CPredicate, CPredicate, CPredicate);
84static void InitVersion(
void);
86static void InitWorker(
int wid);
94static char *optypes[] = {
"",
"xfx",
"xfy",
"yfx",
"xf",
"yf",
"fx",
"fy"};
101int Yap_Portray_delays = FALSE;
199int Yap_IsOpType(
char *type) {
202 for (i = 1; i <= 7; ++i)
203 if (strcmp(type, optypes[i]) == 0)
208static int OpDec(
int p,
const char *type,
Atom a, Term
m) {
213#if defined(MODULE_INDEPENDENT_OPERATORS_FLAG)
214 if (booleanFlag(MODULE_INDEPENDENT_OPERATORS_FLAG)) {
221 else if (
m == USER_MODULE)
224 for (i = 1; i <= 7; ++i)
225 if (strcmp(type, optypes[i]) == 0)
228 Yap_Error(DOMAIN_ERROR_OPERATOR_SPECIFIER, MkAtomTerm(Yap_LookupAtom(type)),
233 if (i == 1 || i == 2 || i == 4)
235 if (i == 1 || i == 3 || i == 6)
238 WRITE_LOCK(ae->ARWLock);
239 info = Yap_GetOpPropForAModuleHavingALock(ae,
m);
240 if (EndOfPAEntr(info)) {
245 info->KindOfPE = Ord(OpProperty);
246 info->NextForME = (me = Yap_GetModuleEntry(
m))->OpForME;
251 info->OpNext = OpList;
255 INIT_RWLOCK(info->OpRWLock);
256 WRITE_LOCK(info->OpRWLock);
257 WRITE_UNLOCK(ae->ARWLock);
258 info->Prefix = info->Infix = info->Posfix = 0;
260 WRITE_LOCK(info->OpRWLock);
261 WRITE_UNLOCK(ae->ARWLock);
264 if (trueGlobalPrologFlag(ISO_FLAG) &&
267 WRITE_UNLOCK(info->OpRWLock);
268 Yap_Error(PERMISSION_ERROR_CREATE_OPERATOR, MkAtomTerm(a),
"op/3");
274 if (trueGlobalPrologFlag(ISO_FLAG) &&
277 WRITE_UNLOCK(info->OpRWLock);
278 Yap_Error(PERMISSION_ERROR_CREATE_OPERATOR, MkAtomTerm(a),
"op/3");
285 WRITE_UNLOCK(info->OpRWLock);
289int Yap_OpDec(
int p,
char *type,
Atom a, Term
m) {
290 return OpDec(p, type, a,
m);
293static void SetOp(
int p,
int type,
char *at, Term
m) {
295 if (GLOBAL_Option[5])
296 fprintf(stderr,
"[setop %d %s %s]\n", p, optypes[type], at);
298 OpDec(p, optypes[type], Yap_LookupAtom(at),
m);
306 memcpy(info, op,
sizeof(
OpEntry));
307 info->NextForME = she->
OpForME;
309 info->OpModule = MkAtomTerm(she->
AtomOfME);
310 AddPropToAtom(ae, AbsOpProp(info));
311 INIT_RWLOCK(info->OpRWLock);
323 n = 6, *prio = (p ^ DcrrpFlag);
326 }
else if (fix == 1) {
329 n = 4, *prio = (p ^ DcrlpFlag);
334 if ((p & DcrrpFlag) && (p & DcrlpFlag))
335 n = 1, *prio = (p ^ (DcrrpFlag | DcrlpFlag));
336 else if (p & DcrrpFlag)
337 n = 3, *prio = (p ^ DcrrpFlag);
338 else if (p & DcrlpFlag)
339 n = 2, *prio = (p ^ DcrlpFlag);
343 return Yap_LookupAtom(optypes[n]);
348 short int opType, opPrio;
351static Opdef Ops[] = {{
":-", xfx, 1200},
355 {
"dynamic", fx, 1150},
356 {
"thread_local", fx, 1150},
357 {
"initialization", fx, 1150},
358 {
"volatile", fx, 1150},
360 {
"public", fx, 1150},
361 {
"multifile", fx, 1150},
362 {
"meta_predicate", fx, 1150},
363 {
"module_transparent", fx, 1150},
364 {
"discontiguous", fx, 1150},
366 {
"sequential", fx, 1150},
372 {
"uncutable", fx, 1150},
426static void InitOps(
void) {
428 for (i = 0; i <
sizeof(Ops) /
sizeof(*Ops); ++i)
429 SetOp(Ops[i].opPrio, Ops[i].opType, Ops[i].opName, PROLOG_MODULE);
440static void InitDebug(
void) {
445 for (i = 1; i < 20; ++i)
446 GLOBAL_Option[i] = 0;
447 if (Yap_output_msg) {
451 if (!_isatty(_fileno(stdin))) {
459 fprintf(stderr,
"absmi address:%p\n", FunAdr(Yap_absmi));
460 fprintf(stderr,
"Set Trace Options:\n");
461 fprintf(stderr,
"a getch\t\tb token\t\tc Lookup\td LookupVar\ti Index\n");
462 fprintf(stderr,
"e SetOp\t\tf compile\tg icode\t\th boot\t\tl log\n");
463 fprintf(stderr,
"m Machine\t p parser\n");
464 while ((ch = putchar(getchar())) !=
'\n' && ch !=
'\r') {
465 if (ch >=
'a' && ch <=
'z')
466 GLOBAL_Option[ch -
'a' + 1] = 1;
467 GLOBAL_Option[ch -
'a' + 1] = 1;
469 if (GLOBAL_Option[
'l' - 96]) {
470 GLOBAL_logfile = fopen(LOGFILE,
"w");
471 if (GLOBAL_logfile == NULL) {
472 fprintf(stderr,
"can not open %s\n", LOGFILE);
476 fprintf(stderr,
"logging session to file 'logfile'\n");
478 Yap_SetTextFile(LOGFILE);
487 Yap_PutValue(At, MkIntTerm(15));
490static UInt update_flags_from_prolog(UInt flags,
PredEntry *pe) {
491 if (pe->PredFlags & MetaPredFlag)
492 flags |= MetaPredFlag;
493 if (pe->PredFlags & SourcePredFlag)
494 flags |= SourcePredFlag;
495 if (pe->PredFlags & SequentialPredFlag)
496 flags |= SequentialPredFlag;
497 if (pe->PredFlags & UDIPredFlag)
498 flags |= UDIPredFlag;
499 if (pe->PredFlags & ModuleTransparentPredFlag)
500 flags |= ModuleTransparentPredFlag;
501 if (pe->PredFlags & StandardPredFlag)
502 flags |= StandardPredFlag;
506void Yap_InitCPred(
const char *Name, arity_t Arity, CPredicate code,
507 pred_flags_t flags) {
516 while (atom == NIL) {
517 if (flags & UserCPredFlag)
518 atom = Yap_LookupAtom(Name);
520 atom = Yap_FullLookupAtom(Name);
521 if (atom == NIL && !Yap_growheap(FALSE, 0L, NULL)) {
522 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s", Name);
526 if (Arity == 0) t = MkAtomTerm(atom);
529 f = Yap_MkFunctor(atom, Arity);
530 if (!f && !Yap_growheap(FALSE, 0L, NULL)) {
531 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s", Name);
535 t = Yap_MkNewApplTerm(f,Arity);
538 pe = Yap_new_pred(t, CurrentModule,
false,
"when initializing C-predicate");
539 if (!pe && !Yap_growheap(FALSE,
sizeof(
PredEntry), NULL)) {
540 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s", Name);
544 if (pe->PredFlags & CPredFlag) {
546 flags = update_flags_from_prolog(flags, pe);
547 cl = ClauseCodeToStaticClause(pe->CodeOfPred);
548 if ((flags | StandardPredFlag | CPredFlag) != pe->PredFlags) {
549 Yap_ClauseSpace -= cl->ClSize;
550 Yap_FreeCodeSpace((ADDR)cl);
558 if (flags & SafePredFlag) {
559 sz = (CELL)NEXTOP(NEXTOP(NEXTOP(p_code, Osbpp), p), l);
561 sz = (CELL)NEXTOP(NEXTOP(NEXTOP(NEXTOP(NEXTOP(p_code, e), p), Osbpp), p),
566 if (!Yap_growheap(FALSE, sz, NULL)) {
567 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s", Name);
571 Yap_ClauseSpace += sz;
572 cl->ClFlags = StaticMask;
575 cl->usc.ClLine = Yap_source_line_no();
579 pe->CodeOfPred = p_code;
580 pe->PredFlags = flags | StandardPredFlag | CPredFlag;
581 pe->src.OwnerFile = Yap_ConsultingFile(PASS_REGS1);
582 pe->cs.f_code = code;
583 if (!(flags & SafePredFlag)) {
584 p_code->opc = Yap_opcode(_allocate);
585 p_code = NEXTOP(p_code, e);
587 if (flags & UserCPredFlag)
588 p_code->opc = Yap_opcode(_call_usercpred);
590 p_code->opc = Yap_opcode(_call_cpred);
591 p_code->y_u.Osbpp.bmap = NULL;
592 p_code->y_u.Osbpp.s = -Signed(RealEnvSize);
593 p_code->y_u.Osbpp.p = p_code->y_u.Osbpp.p0 = pe;
594 p_code = NEXTOP(p_code, Osbpp);
595 if (!(flags & SafePredFlag)) {
596 p_code->opc = Yap_opcode(_deallocate);
597 p_code->y_u.p.p = pe;
598 p_code = NEXTOP(p_code, p);
600 p_code->opc = Yap_opcode(_procceed);
601 p_code->y_u.p.p = pe;
602 p_code = NEXTOP(p_code, p);
603 p_code->opc = Yap_opcode(_Ystop);
604 p_code->y_u.l.l = cl->ClCode;
605 pe->OpcodeOfPred = pe->CodeOfPred->opc;
608bool Yap_AddCallToFli(
PredEntry *pe, CPredicate call) {
611 if (pe->PredFlags & BackCPredFlag) {
612 p_code = (
yamop *)(pe->cs.p_code.FirstClause);
613 p_code->y_u.OtapFs.f = call;
615 }
else if (pe->PredFlags & CPredFlag) {
616 pe->cs.f_code = call;
623bool Yap_AddRetryToFli(
PredEntry *pe, CPredicate re) {
626 if (pe->PredFlags & BackCPredFlag) {
627 p_code = (
yamop *)(pe->cs.p_code.FirstClause);
628 p_code = NEXTOP(p_code, OtapFs);
629 p_code->y_u.OtapFs.f = re;
636bool Yap_AddCutToFli(
PredEntry *pe, CPredicate CUT) {
639 if (pe->PredFlags & BackCPredFlag) {
640 p_code = (
yamop *)(pe->cs.p_code.FirstClause);
641 p_code = NEXTOP(p_code, OtapFs);
642 p_code = NEXTOP(p_code, OtapFs);
643 p_code->y_u.OtapFs.f = CUT;
650void Yap_InitCmpPred(
const char *Name, arity_t Arity, CmpPredicate cmp_code,
651 pred_flags_t flags) {
655 yamop *p_code = NULL;
659 while (atom == NIL) {
660 atom = Yap_FullLookupAtom(Name);
661 if (atom == NIL && !Yap_growheap(FALSE, 0L, NULL)) {
662 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s", Name);
668 f = Yap_MkFunctor(atom, Arity);
669 if (!f && !Yap_growheap(FALSE, 0L, NULL)) {
670 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s", Name);
677 pe = RepPredProp(PredPropByFunc(f, CurrentModule));
679 pe = RepPredProp(PredPropByAtom(atom, CurrentModule));
680 if (!pe && !Yap_growheap(FALSE,
sizeof(
PredEntry), NULL)) {
681 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s", Name);
685 if (pe->PredFlags & BinaryPredFlag) {
686 flags = update_flags_from_prolog(flags, pe);
687 p_code = pe->CodeOfPred;
692 (CELL)NEXTOP(NEXTOP(NEXTOP(((
yamop *)NULL), plxxs), p), l);
695 if (!Yap_growheap(FALSE, sz, NULL)) {
696 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s",
701 Yap_ClauseSpace += sz;
702 cl->ClFlags = StaticMask | StandardPredFlag;
705 cl->usc.ClLine = Yap_source_line_no();
712 pe->CodeOfPred = p_code;
713 pe->cs.d_code = cmp_code;
714 pe->ModuleOfPred = CurrentModule;
715 p_code->opc = pe->OpcodeOfPred = Yap_opcode(_call_bfunc_xx);
716 p_code->y_u.plxxs.p = pe;
717 p_code->y_u.plxxs.f = FAILCODE;
718 p_code->y_u.plxxs.x1 = Yap_emit_x(1);
719 p_code->y_u.plxxs.x2 = Yap_emit_x(2);
720 p_code->y_u.plxxs.flags = Yap_compile_cmp_flags(pe);
721 p_code = NEXTOP(p_code, plxxs);
722 p_code->opc = Yap_opcode(_procceed);
723 p_code->y_u.p.p = pe;
724 p_code = NEXTOP(p_code, p);
725 p_code->opc = Yap_opcode(_Ystop);
726 p_code->y_u.l.l = cl->ClCode;
729void Yap_InitAsmPred(
const char *Name, arity_t Arity,
int code, CPredicate def,
730 pred_flags_t flags) {
736 while (atom == NIL) {
737 atom = Yap_FullLookupAtom(Name);
738 if (atom == NIL && !Yap_growheap(FALSE, 0L, NULL)) {
739 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s", Name);
745 f = Yap_MkFunctor(atom, Arity);
746 if (!f && !Yap_growheap(FALSE, 0L, NULL)) {
747 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s", Name);
754 pe = RepPredProp(PredPropByFunc(f, CurrentModule));
756 pe = RepPredProp(PredPropByAtom(atom, CurrentModule));
757 if (!pe && !Yap_growheap(FALSE,
sizeof(
PredEntry), NULL)) {
758 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s", Name);
762 flags |= AsmPredFlag | StandardPredFlag | (code);
763 if (pe->PredFlags & AsmPredFlag) {
764 flags = update_flags_from_prolog(flags, pe);
767 pe->PredFlags = flags;
769 pe->ModuleOfPred = CurrentModule;
774 if (pe->CodeOfPred == (
yamop *)(&(pe->OpcodeOfPred))) {
775 if (flags & SafePredFlag) {
777 (CELL)NEXTOP(NEXTOP(NEXTOP(((
yamop *)p_code), Osbpp), p), l));
780 NEXTOP(NEXTOP(NEXTOP(NEXTOP(((
yamop *)p_code), e), Osbpp), p), p),
784 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"No Heap Space in InitAsmPred");
788 (CELL)NEXTOP(NEXTOP(NEXTOP(((
yamop *)p_code), Osbpp), p), l);
790 cl = ClauseCodeToStaticClause(pe->CodeOfPred);
792 cl->ClFlags = StaticMask;
794 if (flags & SafePredFlag) {
795 cl->ClSize = (CELL)NEXTOP(NEXTOP(NEXTOP(((
yamop *)p_code), Osbpp), e), e);
797 cl->ClSize = (CELL)NEXTOP(
798 NEXTOP(NEXTOP(NEXTOP(NEXTOP(((
yamop *)p_code), e), Osbpp), p), e), e);
800 cl->usc.ClLine = Yap_source_line_no();
802 pe->CodeOfPred = p_code;
803 if (!(flags & SafePredFlag)) {
804 p_code->opc = Yap_opcode(_allocate);
805 p_code = NEXTOP(p_code, e);
807 p_code->opc = Yap_opcode(_call_cpred);
808 p_code->y_u.Osbpp.bmap = NULL;
809 p_code->y_u.Osbpp.s = -Signed(RealEnvSize);
810 p_code->y_u.Osbpp.p = p_code->y_u.Osbpp.p0 = pe;
811 p_code = NEXTOP(p_code, Osbpp);
812 if (!(flags & SafePredFlag)) {
813 p_code->opc = Yap_opcode(_deallocate);
814 p_code->y_u.p.p = pe;
815 p_code = NEXTOP(p_code, p);
817 p_code->opc = Yap_opcode(_procceed);
818 p_code->y_u.p.p = pe;
819 p_code = NEXTOP(p_code, p);
820 p_code->opc = Yap_opcode(_Ystop);
821 p_code->y_u.l.l = cl->ClCode;
822 pe->OpcodeOfPred = pe->CodeOfPred->opc;
824 pe->OpcodeOfPred = Yap_opcode(_undef_p);
825 pe->CodeOfPred = (
yamop *)(&(pe->OpcodeOfPred));
829static void CleanBack(
PredEntry *pe, CPredicate Start, CPredicate Cont,
832 if (pe->cs.p_code.FirstClause != pe->cs.p_code.LastClause ||
833 pe->cs.p_code.TrueCodeOfPred != pe->cs.p_code.FirstClause ||
834 pe->CodeOfPred != pe->cs.p_code.FirstClause) {
835 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
836 "initiating a C Pred with backtracking");
839 code = (
yamop *)(pe->cs.p_code.FirstClause);
840 code->y_u.OtapFs.p = pe;
841 if (pe->PredFlags & UserCPredFlag)
842 code->opc = Yap_opcode(_try_userc);
844 code->opc = Yap_opcode(_try_c);
846 INIT_YAMOP_LTT(code, 2);
849 code->y_u.OtapFs.f = Start;
850 code = NEXTOP(code, OtapFs);
851 if (pe->PredFlags & UserCPredFlag)
852 code->opc = Yap_opcode(_retry_userc);
854 code->opc = Yap_opcode(_retry_c);
856 INIT_YAMOP_LTT(code, 1);
859 code->y_u.OtapFs.f = Cont;
860 code = NEXTOP(code, OtapFs);
861 if (pe->PredFlags & UserCPredFlag)
862 code->opc = Yap_opcode(_cut_c);
864 code->opc = Yap_opcode(_cut_userc);
865 code->y_u.OtapFs.p = pe;
866 code->y_u.OtapFs.f = Cut;
869void Yap_InitCPredBack(
const char *Name, arity_t Arity, arity_t Extra,
870 CPredicate Call, CPredicate Retry, pred_flags_t flags) {
871 Yap_InitCPredBack_(Name, Arity, Extra, Call, Retry, NULL, flags);
874void Yap_InitCPredBackCut(
const char *Name, arity_t Arity, arity_t Extra,
875 CPredicate Start, CPredicate Cont, CPredicate Cut,
876 pred_flags_t flags) {
877 Yap_InitCPredBack_(Name, Arity, Extra, Start, Cont, Cut, flags);
880void Yap_InitCPredBack_(
const char *Name, arity_t Arity, arity_t Extra,
881 CPredicate Start, CPredicate Cont, CPredicate Cut,
882 pred_flags_t flags) {
888 while (atom == NIL) {
889 atom = Yap_FullLookupAtom(Name);
890 if (atom == NIL && !Yap_growheap(FALSE, 0L, NULL)) {
891 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s", Name);
897 f = Yap_MkFunctor(atom, Arity);
898 if (!f && !Yap_growheap(FALSE, 0L, NULL)) {
899 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s", Name);
906 pe = RepPredProp(PredPropByFunc(f, CurrentModule));
908 pe = RepPredProp(PredPropByAtom(atom, CurrentModule));
909 if (!pe && !Yap_growheap(FALSE,
sizeof(
PredEntry), NULL)) {
910 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"while initializing %s", Name);
914 if (pe->cs.p_code.FirstClause != NIL) {
915 flags = update_flags_from_prolog(flags, pe);
916 CleanBack(pe, Start, Cont, Cut);
921 (CELL)NEXTOP(NEXTOP(NEXTOP(NEXTOP(code, OtapFs), OtapFs), OtapFs), l);
922 if (flags & UserCPredFlag)
923 pe->PredFlags = UserCPredFlag | BackCPredFlag | CompiledPredFlag | flags;
925 pe->PredFlags = CompiledPredFlag | StandardPredFlag | BackCPredFlag;
928 pe->PredFlags |= SequentialPredFlag;
934 Yap_Error(RESOURCE_ERROR_HEAP, TermNil,
"No Heap Space in InitCPredBack");
937 cl->ClFlags = StaticMask;
939 Yap_ClauseSpace += sz;
941 (CELL)NEXTOP(NEXTOP(NEXTOP(NEXTOP(code, OtapFs), OtapFs), OtapFs), e);
942 cl->usc.ClLine = Yap_source_line_no();
945 pe->cs.p_code.TrueCodeOfPred = pe->CodeOfPred = pe->cs.p_code.FirstClause =
946 pe->cs.p_code.LastClause = code;
947 if (flags & UserCPredFlag)
948 pe->OpcodeOfPred = code->opc = Yap_opcode(_try_userc);
950 pe->OpcodeOfPred = code->opc = Yap_opcode(_try_c);
951 code->y_u.OtapFs.f = Start;
952 code->y_u.OtapFs.p = pe;
953 code->y_u.OtapFs.s = Arity;
954 code->y_u.OtapFs.extra = Extra;
956 INIT_YAMOP_LTT(code, 2);
959 code = NEXTOP(code, OtapFs);
960 if (flags & UserCPredFlag)
961 code->opc = Yap_opcode(_retry_userc);
963 code->opc = Yap_opcode(_retry_c);
964 code->y_u.OtapFs.f = Cont;
965 code->y_u.OtapFs.p = pe;
966 code->y_u.OtapFs.s = Arity;
967 code->y_u.OtapFs.extra = Extra;
969 INIT_YAMOP_LTT(code, 1);
972 code = NEXTOP(code, OtapFs);
973 if (flags & UserCPredFlag)
974 code->opc = Yap_opcode(_cut_userc);
976 code->opc = Yap_opcode(_cut_c);
977 code->y_u.OtapFs.f = Cut;
978 code->y_u.OtapFs.p = pe;
979 code->y_u.OtapFs.s = Arity;
980 code->y_u.OtapFs.extra = Extra;
981 code = NEXTOP(code, OtapFs);
982 code->opc = Yap_opcode(_Ystop);
983 code->y_u.l.l = cl->ClCode;
990 Yap_InitBackCPreds();
991 BACKUP_MACHINE_REGS();
999static void InitPredHash(
void) {
1003 PredHashInitialSize);
1004 PredHashTableSize = PredHashInitialSize;
1005 if (PredHash == NULL) {
1006 Yap_Error(SYSTEM_ERROR_FATAL, MkIntTerm(0),
1007 "allocating initial predicate hash table");
1009 for (i = 0; i < PredHashTableSize; ++i) {
1012 INIT_RWLOCK(PredHashRWLock);
1015static void InitEnvInst(
yamop start[2],
yamop **instp, op_numbers opc,
1020 ipc->opc = Yap_opcode(_call);
1021 ipc->y_u.Osbpp.s = -Signed(RealEnvSize);
1022 ipc->y_u.Osbpp.bmap = NULL;
1023 ipc->y_u.Osbpp.p = pred;
1024 ipc->y_u.Osbpp.p0 = pred;
1025 ipc = NEXTOP(ipc, Osbpp);
1026 ipc->opc = Yap_opcode(opc);
1030static void InitOtaplInst(
yamop start[1], OPCODE opc,
PredEntry *pe) {
1034 ipc->opc = Yap_opcode(opc);
1035 ipc->y_u.Otapl.s = 0;
1036 ipc->y_u.Otapl.p = pe;
1037 ipc->y_u.Otapl.d = NULL;
1039 INIT_YAMOP_LTT(ipc, 1);
1042 ipc->y_u.Otapl.te = NULL;
1046static void InitDBErasedMarker(
void) {
1047 DBErasedMarker = (
DBRef)Yap_AllocCodeSpace(
sizeof(
DBStruct));
1048 Yap_LUClauseSpace +=
sizeof(
DBStruct);
1049 DBErasedMarker->id = FunctorDBRef;
1050 DBErasedMarker->Flags = ErasedMask;
1051 DBErasedMarker->Code = NULL;
1052 DBErasedMarker->DBT.DBRefs = NULL;
1053 DBErasedMarker->Parent = NULL;
1056static void InitLogDBErasedMarker(
void) {
1057 LogDBErasedMarker = (
LogUpdClause *)Yap_AllocCodeSpace(
1060 LogDBErasedMarker->Id = FunctorDBRef;
1061 LogDBErasedMarker->ClFlags = ErasedMask | LogUpdMask;
1062 LogDBErasedMarker->lusl.ClSource = NULL;
1063 LogDBErasedMarker->ClRefCount = 0;
1064 LogDBErasedMarker->ClExt = NULL;
1065 LogDBErasedMarker->ClPrev = NULL;
1066 LogDBErasedMarker->ClNext = NULL;
1067 LogDBErasedMarker->ClSize = (UInt)NEXTOP(((
LogUpdClause *)NULL)->ClCode, e);
1068 LogDBErasedMarker->ClCode->opc = Yap_opcode(_op_fail);
1069 INIT_CLREF_COUNT(LogDBErasedMarker);
1072static void InitEmptyWakeups(
void) {}
1074static void InitAtoms(
void) {
1076 AtomHashTableSize = MaxHash;
1079 if (HashChain == NULL) {
1080 Yap_Error(SYSTEM_ERROR_FATAL, MkIntTerm(0),
1081 "allocating initial atom table");
1083 for (i = 0; i < MaxHash; ++i) {
1084 INIT_RWLOCK(HashChain[i].AERWLock);
1085 HashChain[i].Entry = NIL;
1088#if 0 && OLD_STYLE_INITIAL_ATOMS
1089 Yap_LookupAtomWithAddress(
"**", (
AtomEntry *)&(SF_STORE->AtFoundVar));
1090 Yap_ReleaseAtom(AtomFoundVar);
1091 Yap_LookupAtomWithAddress(
"?", (
AtomEntry *)&(SF_STORE->AtFreeTerm));
1092 Yap_ReleaseAtom(AtomFreeTerm);
1093 Yap_LookupAtomWithAddress(
"[]", (
AtomEntry *)&(SF_STORE->AtNil));
1094 Yap_LookupAtomWithAddress(
".", (
AtomEntry *)&(SF_STORE->AtDot));
1096 AtomFoundVar = Yap_LookupAtom(
"**");
1097 Yap_ReleaseAtom(AtomFoundVar);
1098 AtomFreeTerm = Yap_LookupAtom(
"?");
1099 Yap_ReleaseAtom(AtomFreeTerm);
1100 AtomNil = Yap_LookupAtom(
"[]");
1101 AtomDot = Yap_LookupAtom(
".");
1105static void InitWideAtoms(
void) {
1108 WideAtomHashTableSize = MaxWideHash;
1111 if (WideHashChain == NULL) {
1112 Yap_Error(SYSTEM_ERROR_FATAL, MkIntTerm(0),
"allocating wide atom table");
1114 for (i = 0; i < MaxWideHash; ++i) {
1115 INIT_RWLOCK(WideHashChain[i].AERWLock);
1116 WideHashChain[i].Entry = NIL;
1121static void InitInvisibleAtoms(
void) {
1123 INVISIBLECHAIN.Entry = NIL;
1124 INIT_RWLOCK(INVISIBLECHAIN.AERWLock);
1128void Yap_init_yapor_workers(
void) {
1135 GLOBAL_master_worker = getpid();
1136 if (GLOBAL_number_workers > 1) {
1140 Yap_Error(SYSTEM_ERROR_FATAL, TermNil,
1141 "fork error (Yap_init_yapor_workers)");
1145 struct sigaction sigact;
1146 sigact.sa_handler = SIG_DFL;
1147 sigemptyset(&sigact.sa_mask);
1148 sigact.sa_flags = SA_RESTART;
1149 sigaction(SIGINT, &sigact, NULL);
1153 GLOBAL_worker_pid(0) = getpid();
1156 for (proc = 1; proc < GLOBAL_number_workers; proc++) {
1160 Yap_Error(SYSTEM_ERROR_FATAL, TermNil,
1161 "fork error (Yap_init_yapor_workers)");
1165 Yap_remap_yapor_memory();
1166 LOCAL = REMOTE(worker_id);
1167 memcpy(REMOTE(worker_id), REMOTE(0),
sizeof(
struct worker_local));
1168 InitWorker(worker_id);
1171 GLOBAL_worker_pid(proc) = son;
1177static void InitThreadHandle(
int wid) {
1178 REMOTE_ThreadHandle(wid).in_use = FALSE;
1179 REMOTE_ThreadHandle(wid).zombie = FALSE;
1180 REMOTE_ThreadHandle(wid).local_preds = NULL;
1181#ifdef LOW_LEVEL_TRACER
1182 REMOTE_ThreadHandle(wid).thread_inst_count = 0LL;
1184 pthread_mutex_init(&(REMOTE_ThreadHandle(wid).tlock), NULL);
1185 pthread_mutex_init(&(REMOTE_ThreadHandle(wid).tlock_status), NULL);
1186 REMOTE_ThreadHandle(wid).tdetach = (CELL)0;
1187 REMOTE_ThreadHandle(wid).cmod = (CELL)0;
1189 mbox_t *mboxp = &REMOTE_ThreadHandle(wid).mbox_handle;
1190 pthread_mutex_t *mutexp;
1191 pthread_cond_t *condp;
1194 mboxp->name = MkIntTerm(0);
1195 condp = &mboxp->cond;
1196 pthread_cond_init(condp, NULL);
1197 mutexp = &mboxp->mutex;
1198 pthread_mutex_init(mutexp, NULL);
1199 msgsp = &mboxp->msgs;
1201 mboxp->nclients = 0;
1203 Yap_init_tqueue(msgsp);
1207int Yap_InitThread(
int new_id) {
1213 Yap_local[new_id] = new_s;
1214 if (!((
REGSTORE *)pthread_getspecific(Yap_yaamregs_key))) {
1216 pthread_setspecific(Yap_yaamregs_key, (
const void *)rs);
1217 REMOTE_ThreadHandle(new_id).default_yaam_regs = rs;
1218 REMOTE_ThreadHandle(new_id).current_yaam_regs = rs;
1219 rs->worker_id_ = new_id;
1220 rs->worker_local_ = REMOTE(new_id);
1228static void InitScratchPad(
int wid) {
1229 REMOTE_ScratchPad(wid).ptr = NULL;
1230 REMOTE_ScratchPad(wid).sz = SCRATCH_START_SIZE;
1231 REMOTE_ScratchPad(wid).msz = SCRATCH_START_SIZE;
1234static CELL *InitHandles(
int wid) {
1235 size_t initial_slots = 1024;
1238 REMOTE_CurSlot(wid) = 1;
1239 REMOTE_NSlots(wid) = initial_slots;
1240 handles = calloc(initial_slots,
sizeof(CELL));
1242 if (handles == NULL) {
1243 Yap_Error(SYSTEM_ERROR_INTERNAL, 0 ,
1244 "No space for handles at " __FILE__
" : %d", __LINE__);
1247 RESET_VARIABLE(handles);
1251void Yap_CloseScratchPad(
void) {
1253 Yap_FreeCodeSpace(LOCAL_ScratchPad.ptr);
1254 LOCAL_ScratchPad.sz = SCRATCH_START_SIZE;
1255 LOCAL_ScratchPad.msz = SCRATCH_START_SIZE;
1258#include "iglobals.h"
1262#if defined(YAPOR_COPY) || defined(YAPOR_COW) || defined(YAPOR_SBA)
1264long Yap_worker_area_size;
1281 for (wid = 1; wid < MAX_THREADS; wid++) {
1282 Yap_local[wid] = NULL;
1285#include "ihstruct.h"
1293 Yap_InitFirstWorkerThreadHandle();
1295 LOCAL_SourceModule = CurrentModule = 0;
1296 Yap_ReleaseAtom(AtomOfTerm(TermRefoundVar));
1304 PredEntry *modp = RepPredProp(PredPropByFunc(FunctorModule, PROLOG_MODULE));
1305 modp->PredFlags |= MetaPredFlag;
1308 Yap_heap_regs->getwork_code->y_u.Otapl.p =
1309 RepPredProp(PredPropByAtom(AtomGetwork, PROLOG_MODULE));
1310 Yap_heap_regs->getwork_seq_code->y_u.Otapl.p =
1311 RepPredProp(PredPropByAtom(AtomGetworkSeq, PROLOG_MODULE));
1315static void InitVersion(
void) {
1316 Yap_PutValue(AtomVersionNumber, MkAtomTerm(Yap_LookupAtom(YAP_FULL_VERSION)));
1319const char *Yap_version(
void) {
1320 Term t = Yap_GetValue(AtomVersionNumber);
1321 return RepAtom(AtomOfTerm(t))->StrOfAE;
1325 UInt Heap, UInt Stack, UInt Trail, UInt Atts,
1326 UInt max_table_size,
int n_workers,
int sch_loop,
1334 if (!(Yap_local[0] =
1337 pthread_key_create(&Yap_yaamregs_key, NULL);
1338 pthread_setspecific(Yap_yaamregs_key, (
const void *)&Yap_standard_regs);
1339 GLOBAL_master_thread = pthread_self();
1342 Yap_regp = &Yap_standard_regs;
1349 Yap_regp = ((
REGSTORE *)pthread_getspecific(Yap_yaamregs_key));
1352#if defined(YAPOR_COPY) || defined(YAPOR_COW) || defined(YAPOR_SBA)
1355 if (Heap < MinHeapSpace)
1356 Heap = MinHeapSpace;
1357 Heap = AdjustPageSize(Heap * K);
1360 if (Trail < MinTrailSpace)
1361 Trail = MinTrailSpace;
1362 Trail = AdjustPageSize(Trail * K);
1364 if (Stack < MinStackSpace)
1365 Stack = MinStackSpace;
1366 Stack = AdjustPageSize(Stack * K);
1369 Atts = 2048 *
sizeof(CELL);
1371 Atts = AdjustPageSize(Atts * K);
1373#if defined(THREADS) || defined(YAPOR)
1377 if (n_workers > MAX_WORKERS)
1378 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
"excessive number of workers");
1380 INFORMATION_MESSAGE(
"YapOr: copy model with %d worker%s", n_workers,
1381 n_workers == 1 ?
"" :
"s");
1383 INFORMATION_MESSAGE(
"YapOr: acow model with %d worker%s", n_workers,
1384 n_workers == 1 ?
"" :
"s");
1386 INFORMATION_MESSAGE(
"YapOr: sba model with %d worker%s", n_workers,
1387 n_workers == 1 ?
"" :
"s");
1389 INFORMATION_MESSAGE(
"YapOr: threads model with %d worker%s", n_workers,
1390 n_workers == 1 ?
"" :
"s");
1393#if defined(YAPOR_COPY) || defined(YAPOR_COW) || defined(YAPOR_SBA)
1394 Yap_init_yapor_stacks_memory(Trail, Heap, Stack + Atts, n_workers);
1396 Yap_InitMemory(Trail, Heap, Stack + Atts);
1398#if defined(YAPOR) || defined(TABLING)
1399 Yap_init_global_optyap_data(max_table_size, n_workers, sch_loop, delay_load);
1402 Yap_AttsSize = Atts;
1406 Yap_InitAbsmi(REGS, FunctorList);
1416 regcache = ((
REGSTORE *)pthread_getspecific(Yap_yaamregs_key));
1418#if USE_SYSTEM_MALLOC
1419 if (Trail < MinTrailSpace)
1420 Trail = MinTrailSpace;
1421 if (Stack < MinStackSpace)
1422 Stack = MinStackSpace;
1423 if (!(LOCAL_GlobalBase = (ADDR)calloc((Trail + Stack) , 1024))) {
1424 Yap_Error(RESOURCE_ERROR_HEAP, 0,
1425 "could not allocate stack space for main thread");
1430 LOCAL_ThreadHandle.stack_address = LOCAL_GlobalBase;
1431 LOCAL_ThreadHandle.tsize = Trail;
1432 LOCAL_ThreadHandle.ssize = Stack;
1435 GLOBAL_AllowGlobalExpansion =
true;
1436 GLOBAL_AllowLocalExpansion =
true;
1437 GLOBAL_AllowTrailExpansion =
true;
1438 Yap_InitExStacks(0, Trail, Stack);
1439 Yap_InitYaamRegs(0,
true);
1442 { Yap_ReleasePreAllocCodeSpace(Yap_PreAllocCodeSpace()); }
1445int Yap_HaltRegisterHook(HaltHookFunc f,
void *env) {
1450 h->environment = env;
1453 h->next = GLOBAL_HaltHooks;
1454 GLOBAL_HaltHooks = h;
1459static void run_halt_hooks(
int code) {
1460 struct halt_hook *hooke = GLOBAL_HaltHooks;
1463 hooke->hook(code, hooke->environment);
1464 hooke = hooke->next;
1468noreturn
void Yap_exit(
int value) {
1470 void closeFiles(
int all);
1471#if defined(YAPOR_COPY) || defined(YAPOR_COW) || defined(YAPOR_SBA)
1472 Yap_unmap_yapor_memory();
1475 if (!(LOCAL_PrologMode & BootMode)) {
1477 remove(
"PROFPREDS");
1478 remove(
"PROFILING");
1480 run_halt_hooks(value);
1481 Yap_ShutdownLoadForeign();
1484 Yap_CloseReadline();
1485#if USE_SYSTEM_MALLOC
load_foreign_files/3 has works for the following configurations:
void Yap_InitFlags(bool bootstrap)
Init System Prolog flags.
Module property: low-level data used to manage modes.
Atom AtomOfME
index in operator table
struct operator_entry * OpForME
index in module table