| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <errno.h> | 5 #include <errno.h> |
| 6 #include <stdio.h> | 6 #include <stdio.h> |
| 7 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 7 #ifdef COMPRESS_STARTUP_DATA_BZ2 |
| 8 #include <bzlib.h> | 8 #include <bzlib.h> |
| 9 #endif | 9 #endif |
| 10 #include <signal.h> | 10 #include <signal.h> |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 context_snapshot_data, context_serializer); | 71 context_snapshot_data, context_serializer); |
| 72 MaybeWriteStartupBlob(snapshot_data, serializer, | 72 MaybeWriteStartupBlob(snapshot_data, serializer, |
| 73 context_snapshot_data, context_serializer); | 73 context_snapshot_data, context_serializer); |
| 74 } | 74 } |
| 75 | 75 |
| 76 private: | 76 private: |
| 77 void MaybeWriteStartupBlob(const i::List<i::byte>& snapshot_data, | 77 void MaybeWriteStartupBlob(const i::List<i::byte>& snapshot_data, |
| 78 const i::Serializer& serializer, | 78 const i::Serializer& serializer, |
| 79 const i::List<i::byte>& context_snapshot_data, | 79 const i::List<i::byte>& context_snapshot_data, |
| 80 const i::Serializer& context_serializer) const { | 80 const i::Serializer& context_serializer) const { |
| 81 if (!startup_blob_file_) | 81 if (!startup_blob_file_) return; |
| 82 return; | |
| 83 | 82 |
| 84 i::List<i::byte> startup_blob; | 83 i::SnapshotByteSink sink; |
| 85 i::ListSnapshotSink sink(&startup_blob); | |
| 86 | 84 |
| 87 int spaces[] = {i::NEW_SPACE, i::OLD_POINTER_SPACE, | 85 int spaces[] = {i::NEW_SPACE, i::OLD_POINTER_SPACE, |
| 88 i::OLD_DATA_SPACE, i::CODE_SPACE, | 86 i::OLD_DATA_SPACE, i::CODE_SPACE, |
| 89 i::MAP_SPACE, i::CELL_SPACE, | 87 i::MAP_SPACE, i::CELL_SPACE, |
| 90 i::PROPERTY_CELL_SPACE, i::LO_SPACE}; | 88 i::PROPERTY_CELL_SPACE, i::LO_SPACE}; |
| 91 | 89 |
| 92 i::byte* snapshot_bytes = snapshot_data.begin(); | 90 i::byte* snapshot_bytes = snapshot_data.begin(); |
| 93 sink.PutBlob(snapshot_bytes, snapshot_data.length(), "snapshot"); | 91 sink.PutBlob(snapshot_bytes, snapshot_data.length(), "snapshot"); |
| 94 for (size_t i = 0; i < arraysize(spaces); ++i) { | 92 for (size_t i = 0; i < arraysize(spaces); ++i) { |
| 95 i::Vector<const uint32_t> chunks = | 93 i::Vector<const uint32_t> chunks = |
| 96 serializer.FinalAllocationChunks(spaces[i]); | 94 serializer.FinalAllocationChunks(spaces[i]); |
| 97 // For the start-up snapshot, none of the reservations has more than | 95 // For the start-up snapshot, none of the reservations has more than |
| 98 // one chunk (reservation for each space fits onto a single page). | 96 // one chunk (reservation for each space fits onto a single page). |
| 99 CHECK_EQ(1, chunks.length()); | 97 CHECK_EQ(1, chunks.length()); |
| 100 sink.PutInt(chunks[0], "spaces"); | 98 sink.PutInt(chunks[0], "spaces"); |
| 101 } | 99 } |
| 102 | 100 |
| 103 i::byte* context_bytes = context_snapshot_data.begin(); | 101 i::byte* context_bytes = context_snapshot_data.begin(); |
| 104 sink.PutBlob(context_bytes, context_snapshot_data.length(), "context"); | 102 sink.PutBlob(context_bytes, context_snapshot_data.length(), "context"); |
| 105 for (size_t i = 0; i < arraysize(spaces); ++i) { | 103 for (size_t i = 0; i < arraysize(spaces); ++i) { |
| 106 i::Vector<const uint32_t> chunks = | 104 i::Vector<const uint32_t> chunks = |
| 107 context_serializer.FinalAllocationChunks(spaces[i]); | 105 context_serializer.FinalAllocationChunks(spaces[i]); |
| 108 // For the context snapshot, none of the reservations has more than | 106 // For the context snapshot, none of the reservations has more than |
| 109 // one chunk (reservation for each space fits onto a single page). | 107 // one chunk (reservation for each space fits onto a single page). |
| 110 CHECK_EQ(1, chunks.length()); | 108 CHECK_EQ(1, chunks.length()); |
| 111 sink.PutInt(chunks[0], "spaces"); | 109 sink.PutInt(chunks[0], "spaces"); |
| 112 } | 110 } |
| 113 | 111 |
| 112 const i::List<i::byte>& startup_blob = sink.data(); |
| 114 size_t written = fwrite(startup_blob.begin(), 1, startup_blob.length(), | 113 size_t written = fwrite(startup_blob.begin(), 1, startup_blob.length(), |
| 115 startup_blob_file_); | 114 startup_blob_file_); |
| 116 if (written != (size_t)startup_blob.length()) { | 115 if (written != static_cast<size_t>(startup_blob.length())) { |
| 117 i::PrintF("Writing snapshot file failed.. Aborting.\n"); | 116 i::PrintF("Writing snapshot file failed.. Aborting.\n"); |
| 118 exit(1); | 117 exit(1); |
| 119 } | 118 } |
| 120 } | 119 } |
| 121 | 120 |
| 122 void WriteSnapshotFile(const i::List<i::byte>& snapshot_data, | 121 void WriteSnapshotFile(const i::List<i::byte>& snapshot_data, |
| 123 const i::Serializer& serializer, | 122 const i::Serializer& serializer, |
| 124 const i::List<i::byte>& context_snapshot_data, | 123 const i::List<i::byte>& context_snapshot_data, |
| 125 const i::Serializer& context_serializer) const { | 124 const i::Serializer& context_serializer) const { |
| 126 WriteFilePrefix(); | 125 WriteFilePrefix(); |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 } | 412 } |
| 414 } | 413 } |
| 415 // If we don't do this then we end up with a stray root pointing at the | 414 // If we don't do this then we end up with a stray root pointing at the |
| 416 // context even after we have disposed of the context. | 415 // context even after we have disposed of the context. |
| 417 internal_isolate->heap()->CollectAllAvailableGarbage("mksnapshot"); | 416 internal_isolate->heap()->CollectAllAvailableGarbage("mksnapshot"); |
| 418 i::Object* raw_context = *v8::Utils::OpenPersistent(context); | 417 i::Object* raw_context = *v8::Utils::OpenPersistent(context); |
| 419 context.Reset(); | 418 context.Reset(); |
| 420 | 419 |
| 421 // This results in a somewhat smaller snapshot, probably because it gets | 420 // This results in a somewhat smaller snapshot, probably because it gets |
| 422 // rid of some things that are cached between garbage collections. | 421 // rid of some things that are cached between garbage collections. |
| 423 i::List<i::byte> snapshot_data; | 422 i::SnapshotByteSink snapshot_sink; |
| 424 i::ListSnapshotSink snapshot_sink(&snapshot_data); | |
| 425 i::StartupSerializer ser(internal_isolate, &snapshot_sink); | 423 i::StartupSerializer ser(internal_isolate, &snapshot_sink); |
| 426 ser.SerializeStrongReferences(); | 424 ser.SerializeStrongReferences(); |
| 427 | 425 |
| 428 i::List<i::byte> context_data; | 426 i::SnapshotByteSink context_sink; |
| 429 i::ListSnapshotSink contex_sink(&context_data); | 427 i::PartialSerializer context_ser(internal_isolate, &ser, &context_sink); |
| 430 i::PartialSerializer context_ser(internal_isolate, &ser, &contex_sink); | |
| 431 context_ser.Serialize(&raw_context); | 428 context_ser.Serialize(&raw_context); |
| 432 ser.SerializeWeakReferences(); | 429 ser.SerializeWeakReferences(); |
| 433 | 430 |
| 434 context_ser.FinalizeAllocation(); | 431 context_ser.FinalizeAllocation(); |
| 435 ser.FinalizeAllocation(); | 432 ser.FinalizeAllocation(); |
| 436 | 433 |
| 437 { | 434 { |
| 438 SnapshotWriter writer(argv[1]); | 435 SnapshotWriter writer(argv[1]); |
| 439 if (i::FLAG_raw_file && i::FLAG_raw_context_file) | 436 if (i::FLAG_raw_file && i::FLAG_raw_context_file) |
| 440 writer.SetRawFiles(i::FLAG_raw_file, i::FLAG_raw_context_file); | 437 writer.SetRawFiles(i::FLAG_raw_file, i::FLAG_raw_context_file); |
| 441 if (i::FLAG_startup_blob) | 438 if (i::FLAG_startup_blob) |
| 442 writer.SetStartupBlobFile(i::FLAG_startup_blob); | 439 writer.SetStartupBlobFile(i::FLAG_startup_blob); |
| 443 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 440 #ifdef COMPRESS_STARTUP_DATA_BZ2 |
| 444 BZip2Compressor bzip2; | 441 BZip2Compressor bzip2; |
| 445 writer.SetCompressor(&bzip2); | 442 writer.SetCompressor(&bzip2); |
| 446 #endif | 443 #endif |
| 447 writer.WriteSnapshot(snapshot_data, ser, context_data, context_ser); | 444 writer.WriteSnapshot(snapshot_sink.data(), ser, context_sink.data(), |
| 445 context_ser); |
| 448 } | 446 } |
| 449 } | 447 } |
| 450 | 448 |
| 451 isolate->Dispose(); | 449 isolate->Dispose(); |
| 452 V8::Dispose(); | 450 V8::Dispose(); |
| 453 V8::ShutdownPlatform(); | 451 V8::ShutdownPlatform(); |
| 454 delete platform; | 452 delete platform; |
| 455 return 0; | 453 return 0; |
| 456 } | 454 } |
| OLD | NEW |