##// END OF EJS Templates
rust-index: only access offsets if revlog is inline...
Raphaël Gomès -
r52157:47a34afd default
parent child Browse files
Show More
@@ -403,30 +403,33 b' impl Index {'
403
403
404 /// Return number of entries of the revlog index.
404 /// Return number of entries of the revlog index.
405 pub fn len(&self) -> usize {
405 pub fn len(&self) -> usize {
406 if let Some(offsets) = &*self.get_offsets() {
406 if self.is_inline() {
407 offsets.len()
407 (*self.get_offsets())
408 .as_ref()
409 .expect("inline should have offsets")
410 .len()
408 } else {
411 } else {
409 self.bytes.len() / INDEX_ENTRY_SIZE
412 self.bytes.len() / INDEX_ENTRY_SIZE
410 }
413 }
411 }
414 }
412
415
413 pub fn get_offsets(&self) -> RwLockReadGuard<Option<Vec<usize>>> {
416 pub fn get_offsets(&self) -> RwLockReadGuard<Option<Vec<usize>>> {
414 if self.is_inline() {
417 assert!(self.is_inline());
415 {
418 {
416 // Wrap in a block to drop the read guard
419 // Wrap in a block to drop the read guard
417 // TODO perf?
420 // TODO perf?
418 let mut offsets = self.offsets.write().unwrap();
421 let mut offsets = self.offsets.write().unwrap();
419 if offsets.is_none() {
422 if offsets.is_none() {
420 offsets.replace(inline_scan(&self.bytes.bytes).1);
423 offsets.replace(inline_scan(&self.bytes.bytes).1);
421 }
422 }
424 }
423 }
425 }
424 self.offsets.read().unwrap()
426 self.offsets.read().unwrap()
425 }
427 }
426
428
427 pub fn get_offsets_mut(&mut self) -> RwLockWriteGuard<Option<Vec<usize>>> {
429 pub fn get_offsets_mut(&mut self) -> RwLockWriteGuard<Option<Vec<usize>>> {
430 assert!(self.is_inline());
428 let mut offsets = self.offsets.write().unwrap();
431 let mut offsets = self.offsets.write().unwrap();
429 if self.is_inline() && offsets.is_none() {
432 if offsets.is_none() {
430 offsets.replace(inline_scan(&self.bytes.bytes).1);
433 offsets.replace(inline_scan(&self.bytes.bytes).1);
431 }
434 }
432 offsets
435 offsets
@@ -446,8 +449,8 b' impl Index {'
446 if rev == NULL_REVISION {
449 if rev == NULL_REVISION {
447 return None;
450 return None;
448 }
451 }
449 Some(if let Some(offsets) = &*self.get_offsets() {
452 Some(if self.is_inline() {
450 self.get_entry_inline(rev, offsets.as_ref())
453 self.get_entry_inline(rev)
451 } else {
454 } else {
452 self.get_entry_separated(rev)
455 self.get_entry_separated(rev)
453 })
456 })
@@ -502,11 +505,9 b' impl Index {'
502 })
505 })
503 }
506 }
504
507
505 fn get_entry_inline(
508 fn get_entry_inline(&self, rev: Revision) -> IndexEntry {
506 &self,
509 let offsets = &self.get_offsets();
507 rev: Revision,
510 let offsets = offsets.as_ref().expect("inline should have offsets");
508 offsets: &[usize],
509 ) -> IndexEntry {
510 let start = offsets[rev.0 as usize];
511 let start = offsets[rev.0 as usize];
511 let end = start + INDEX_ENTRY_SIZE;
512 let end = start + INDEX_ENTRY_SIZE;
512 let bytes = &self.bytes[start..end];
513 let bytes = &self.bytes[start..end];
@@ -703,9 +704,11 b' impl Index {'
703 revision_data: RevisionDataParams,
704 revision_data: RevisionDataParams,
704 ) -> Result<(), RevlogError> {
705 ) -> Result<(), RevlogError> {
705 revision_data.validate()?;
706 revision_data.validate()?;
706 let new_offset = self.bytes.len();
707 if self.is_inline() {
707 if let Some(offsets) = &mut *self.get_offsets_mut() {
708 let new_offset = self.bytes.len();
708 offsets.push(new_offset)
709 if let Some(offsets) = &mut *self.get_offsets_mut() {
710 offsets.push(new_offset)
711 }
709 }
712 }
710 self.bytes.added.extend(revision_data.into_v1().as_bytes());
713 self.bytes.added.extend(revision_data.into_v1().as_bytes());
711 self.clear_head_revs();
714 self.clear_head_revs();
@@ -717,10 +720,16 b' impl Index {'
717 }
720 }
718
721
719 pub fn remove(&mut self, rev: Revision) -> Result<(), RevlogError> {
722 pub fn remove(&mut self, rev: Revision) -> Result<(), RevlogError> {
720 let offsets = self.get_offsets().clone();
723 let offsets = if self.is_inline() {
724 self.get_offsets().clone()
725 } else {
726 None
727 };
721 self.bytes.remove(rev, offsets.as_deref())?;
728 self.bytes.remove(rev, offsets.as_deref())?;
722 if let Some(offsets) = &mut *self.get_offsets_mut() {
729 if self.is_inline() {
723 offsets.truncate(rev.0 as usize)
730 if let Some(offsets) = &mut *self.get_offsets_mut() {
731 offsets.truncate(rev.0 as usize)
732 }
724 }
733 }
725 self.clear_head_revs();
734 self.clear_head_revs();
726 Ok(())
735 Ok(())
General Comments 0
You need to be logged in to leave comments. Login now