@@ -887,16 +887,15 @@ struct MemoryTest_t {
887887// This is to test stomp.
888888// undef - this means global_forwardingKind wasn't set yet.
889889//
890- typedef enum { undef, stomp, noStomp, testStomp } ForwardingEnum;
891- ForwardingEnum global_forwardingKind = undef;
890+ core::ForwardingEnum global_forwardingKind = core::undef;
892891
893892[[noreturn]] void errorBadForwardingKind () {
894893 printf (" %s:%d:%s The global_forwardingKind wasn't set\n " , __FILE__, __LINE__, __FUNCTION__);
895894 abort ();
896895}
897896
898897void set_forwarding_pointer (gctools::BaseHeader_s* header, char * new_client, ISLInfo* info) {
899- if (global_forwardingKind == testStomp) {
898+ if (global_forwardingKind == core:: testStomp) {
900899 info->_forwarding [header] = (core::T_O*)new_client;
901900 if ((intptr_t )new_client < 0 ) {
902901 printf (" %s:%d:%s Writing a bad forwarding pointer %p\n " , __FILE__, __LINE__, __FUNCTION__, (void *)new_client);
@@ -906,17 +905,17 @@ void set_forwarding_pointer(gctools::BaseHeader_s* header, char* new_client, ISL
906905 printf (" %s:%d:%s Forwarding pointer written and read don't match\n " , __FILE__, __LINE__, __FUNCTION__);
907906 abort ();
908907 }
909- } else if (global_forwardingKind == noStomp) {
908+ } else if (global_forwardingKind == core:: noStomp) {
910909 info->_forwarding [header] = (core::T_O*)new_client;
911- } else if (global_forwardingKind == stomp) {
910+ } else if (global_forwardingKind == core:: stomp) {
912911 header->_badge_stamp_wtag_mtag .setFwdPointer (new_client);
913912 } else {
914913 errorBadForwardingKind ();
915914 }
916915}
917916
918917bool is_forwarding_pointer (gctools::BaseHeader_s* header, ISLInfo* info) {
919- if (global_forwardingKind == testStomp) {
918+ if (global_forwardingKind == core:: testStomp) {
920919 auto result = info->_forwarding .find (header);
921920 bool noStompResult = (result != info->_forwarding .end ());
922921 bool stompResult = header->_badge_stamp_wtag_mtag .fwdP ();
@@ -925,11 +924,11 @@ bool is_forwarding_pointer(gctools::BaseHeader_s* header, ISLInfo* info) {
925924 abort ();
926925 }
927926 return stompResult;
928- } else if (global_forwardingKind == noStomp) {
927+ } else if (global_forwardingKind == core:: noStomp) {
929928 auto result = info->_forwarding .find (header);
930929 bool noStompResult = (result != info->_forwarding .end ());
931930 return noStompResult;
932- } else if (global_forwardingKind == stomp) {
931+ } else if (global_forwardingKind == core:: stomp) {
933932 bool stompResult = header->_badge_stamp_wtag_mtag .fwdP ();
934933 return stompResult;
935934 } else {
@@ -938,17 +937,17 @@ bool is_forwarding_pointer(gctools::BaseHeader_s* header, ISLInfo* info) {
938937}
939938
940939uintptr_t get_forwarding_pointer (gctools::BaseHeader_s* header, ISLInfo* info) {
941- if (global_forwardingKind == testStomp) {
940+ if (global_forwardingKind == core:: testStomp) {
942941 uintptr_t noStompResult = (uintptr_t )info->_forwarding [header];
943942 uintptr_t stompResult = (uintptr_t )header->_badge_stamp_wtag_mtag .fwdPointer ();
944943 if (noStompResult != stompResult) {
945944 printf (" %s:%d:%s results don't match\n " , __FILE__, __LINE__, __FUNCTION__);
946945 abort ();
947946 }
948947 return stompResult;
949- } else if (global_forwardingKind == noStomp) {
948+ } else if (global_forwardingKind == core:: noStomp) {
950949 return (uintptr_t )info->_forwarding [header];
951- } else if (global_forwardingKind == stomp) {
950+ } else if (global_forwardingKind == core:: stomp) {
952951 return (uintptr_t )header->_badge_stamp_wtag_mtag .fwdPointer ();
953952 } else {
954953 errorBadForwardingKind ();
@@ -1022,7 +1021,7 @@ gctools::clasp_ptr_t maybe_follow_forwarding_pointer(gctools::clasp_ptr_t* clien
10221021 pointer_pool (clientAddress), (void *)client, pointer_pool (client));
10231022 printf (" %s:%d:%s general header %p IS NOT A FORWARDING POINTER - but it must be\n " , __FILE__, __LINE__, __FUNCTION__,
10241023 (void *)header);
1025- if (global_forwardingKind == noStomp) {
1024+ if (global_forwardingKind == core:: noStomp) {
10261025 printf (" - for noStomp is not key in info->_forwarding[header]\n " );
10271026 } else {
10281027 printf (" - *header should be fwd ptr but got %p\n " , *(void **)header);
@@ -2778,9 +2777,12 @@ void snapshot_save(core::SaveLispAndDie& data) {
27782777 memory_test (true , NULL , " In preparation for snapshot_save." );
27792778
27802779 //
2781- // For saving we may want to save snapshots and not die - so use noStomp forwarding.
2780+ // For saving we may want to save snapshots and continue (this is dangerous)
2781+ // In that case use noStomp forwarding.
2782+ // If we are ok with dying then use stomp.
27822783 //
2783- global_forwardingKind = noStomp;
2784+ global_forwardingKind = data._ForwardingKind ;
2785+
27842786 core::lisp_write (fmt::format (" Updated with noStomp forwarding for snapshot_save\n " ));
27852787 //
27862788 // Call Common Lisp code to release things at snapshot-save time
@@ -2909,7 +2911,7 @@ void snapshot_load(void* maybeStartOfSnapshot, void* maybeEndOfSnapshot, const s
29092911 //
29102912 // For loading we need speed - so use stomp forwarding
29112913 //
2912- global_forwardingKind = stomp;
2914+ global_forwardingKind = core:: stomp;
29132915
29142916 {
29152917 MaybeTimeStartup time1 (" Overall snapshot load time" );
0 commit comments