summaryrefslogtreecommitdiff
path: root/src/image_writer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/image_writer.cc')
-rw-r--r--src/image_writer.cc17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/image_writer.cc b/src/image_writer.cc
index e883599a66..33d37c7667 100644
--- a/src/image_writer.cc
+++ b/src/image_writer.cc
@@ -36,6 +36,7 @@
#include "object_utils.h"
#include "runtime.h"
#include "scoped_thread_state_change.h"
+#include "sirt_ref.h"
#include "space.h"
#include "UniquePtr.h"
#include "utils.h"
@@ -320,7 +321,7 @@ void ImageWriter::CalculateNewObjectOffsetsCallback(Object* obj, void* arg) {
DCHECK_EQ(obj, obj->AsString()->Intern());
return;
}
- SirtRef<String> interned(obj->AsString()->Intern());
+ SirtRef<String> interned(Thread::Current(), obj->AsString()->Intern());
if (obj != interned.get()) {
if (!image_writer->IsImageOffsetAssigned(interned.get())) {
// interned obj is after us, allocate its location early
@@ -351,8 +352,9 @@ ObjectArray<Object>* ImageWriter::CreateImageRoots() const {
}
// build an Object[] of the roots needed to restore the runtime
- SirtRef<ObjectArray<Object> > image_roots(
- ObjectArray<Object>::Alloc(object_array_class, ImageHeader::kImageRootsMax));
+ SirtRef<ObjectArray<Object> >
+ image_roots(Thread::Current(),
+ ObjectArray<Object>::Alloc(object_array_class, ImageHeader::kImageRootsMax));
image_roots->Set(ImageHeader::kJniStubArray, runtime->GetJniDlsymLookupStub());
image_roots->Set(ImageHeader::kAbstractMethodErrorStubArray,
runtime->GetAbstractMethodErrorStubArray());
@@ -380,7 +382,8 @@ ObjectArray<Object>* ImageWriter::CreateImageRoots() const {
}
void ImageWriter::CalculateNewObjectOffsets() {
- SirtRef<ObjectArray<Object> > image_roots(CreateImageRoots());
+ Thread* self = Thread::Current();
+ SirtRef<ObjectArray<Object> > image_roots(self, CreateImageRoots());
Heap* heap = Runtime::Current()->GetHeap();
const Spaces& spaces = heap->GetSpaces();
@@ -392,20 +395,20 @@ void ImageWriter::CalculateNewObjectOffsets() {
image_end_ += RoundUp(sizeof(ImageHeader), 8); // 64-bit-alignment
{
- ReaderMutexLock mu(*Locks::heap_bitmap_lock_);
+ ReaderMutexLock mu(self, *Locks::heap_bitmap_lock_);
heap->FlushAllocStack();
}
{
// TODO: Image spaces only?
// TODO: Add InOrderWalk to heap bitmap.
- const char* old = Thread::Current()->StartAssertNoThreadSuspension("ImageWriter");
+ const char* old = self->StartAssertNoThreadSuspension("ImageWriter");
DCHECK(heap->GetLargeObjectsSpace()->GetLiveObjects()->IsEmpty());
for (Spaces::const_iterator it = spaces.begin(); it != spaces.end(); ++it) {
(*it)->GetLiveBitmap()->InOrderWalk(CalculateNewObjectOffsetsCallback, this);
DCHECK_LT(image_end_, image_->Size());
}
- Thread::Current()->EndAssertNoThreadSuspension(old);
+ self->EndAssertNoThreadSuspension(old);
}
// Note that image_top_ is left at end of used space