[squeak-dev] The Trunk: Files-pre.182.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Dec 11 14:28:55 UTC 2018


Patrick Rein uploaded a new version of Files to project The Trunk:
http://source.squeak.org/trunk/Files-pre.182.mcz

==================== Summary ====================

Name: Files-pre.182
Author: pre
Time: 11 December 2018, 3:28:52.883299 pm
UUID: 093bb32f-7338-44b8-a2b7-250c5d9c0956
Ancestors: Files-nice.163, Files-tpr.181

Recategorizes methods in the files package. Also moves a deprecated method into the corresponding deprecated extension category.

=============== Diff against Files-tpr.181 ===============

Item was changed:
+ ----- Method: AsyncFile>>close (in category 'file open/close') -----
- ----- Method: AsyncFile>>close (in category 'as yet unclassified') -----
  close
  
  	fileHandle ifNil: [^ self].  "already closed"
  	self primClose: fileHandle.
  	Smalltalk unregisterExternalObject: semaphore.
  	semaphore := nil.
  	fileHandle := nil.
  !

Item was changed:
+ ----- Method: AsyncFile>>fileHandle (in category 'accessing') -----
- ----- Method: AsyncFile>>fileHandle (in category 'as yet unclassified') -----
  fileHandle
  	^ fileHandle!

Item was changed:
+ ----- Method: AsyncFile>>open:forWrite: (in category 'file open/close') -----
- ----- Method: AsyncFile>>open:forWrite: (in category 'as yet unclassified') -----
  open: fullFileName forWrite: aBoolean
  	"Open a file of the given name, and return a handle for that file. Answer the receiver if the primitive succeeds, nil otherwise.
  	If openForWrite is true, then:
  		if there is no existing file with this name, then create one
  		else open the existing file in read-write mode
  	otherwise:
  		if there is an existing file with this name, then open it read-only
  		else answer nil."
  	"Note: if an exisiting file is opened for writing, it is NOT truncated. If truncation is desired, the file should be deleted before being opened as an asynchronous file."
  	"Note: On some platforms (e.g., Mac), a file can only have one writer at a time."
  
  	name := fullFileName.
  	writeable := aBoolean.
  	^Smalltalk newExternalSemaphoreDo: [ :newSemaphore :index |
  		fileHandle := self primOpen: name asVmPathName forWrite: writeable semaIndex: index.
  		fileHandle
  			ifNotNil: [
  				semaphore := newSemaphore.
  				self ]
  			ifNil: [
  				Smalltalk unregisterExternalObject: newSemaphore.
  				nil ] ]!

Item was changed:
+ ----- Method: AsyncFile>>readByteCount:fromFilePosition:onCompletionDo: (in category 'reading') -----
- ----- Method: AsyncFile>>readByteCount:fromFilePosition:onCompletionDo: (in category 'as yet unclassified') -----
  readByteCount: byteCount fromFilePosition: fPosition onCompletionDo: aBlock
  	"Start a read operation to read byteCount's from the given position in this file. and fork a process to await its completion. When the operation completes, evaluate the given block. Note that, since the completion block may run asynchronous, the client may need to use a SharedQueue or a semaphore for synchronization."
  
  	| buffer |
  	buffer := String new: byteCount.
  	self primReadStart: fileHandle fPosition: fPosition count: byteCount.
  	"here's the process that awaits the results:"
  	[| n |
  		[	semaphore wait.
  		  	n := self primReadResult: fileHandle intoBuffer: buffer at: 1 count: byteCount.
  		  	n = Busy.
  		] whileTrue.  "loop while busy in case the semaphore had excess signals"
  		n = ErrorCode ifTrue: [^ self error: 'asynchronous read operation failed'].
  		aBlock value: buffer.
  	] forkAt: Processor userInterruptPriority.
  !

Item was changed:
+ ----- Method: AsyncFile>>test:fileName: (in category 'tests') -----
- ----- Method: AsyncFile>>test:fileName: (in category 'as yet unclassified') -----
  test: byteCount fileName: fileName
  	"AsyncFile new test: 10000 fileName: 'testData'"
  
  	| buf1 buf2 bytesWritten bytesRead |
  	buf1 := String new: byteCount withAll: $x.
  	buf2 := String new: byteCount.
  	self open: ( FileDirectory default fullNameFor: fileName) forWrite: true.
  	self primWriteStart: fileHandle
  		fPosition: 0
  		fromBuffer: buf1
  		at: 1
  		count: byteCount.
  	semaphore wait.
  	bytesWritten := self primWriteResult: fileHandle.
  	self close.
  	
  	self open: ( FileDirectory default fullNameFor: fileName) forWrite: false.
  	self primReadStart: fileHandle fPosition: 0 count: byteCount.
  	semaphore wait.
  	bytesRead :=
  		self primReadResult: fileHandle
  			intoBuffer: buf2
  			at: 1
  			count: byteCount.
  	self close.
  
  	buf1 = buf2 ifFalse: [self error: 'buffers do not match'].
  	^ 'wrote ', bytesWritten printString, ' bytes; ',
  	   'read ', bytesRead printString, ' bytes'
  !

Item was changed:
+ ----- Method: AsyncFile>>waitForCompletion (in category 'private') -----
- ----- Method: AsyncFile>>waitForCompletion (in category 'as yet unclassified') -----
  waitForCompletion
  	semaphore wait!

Item was changed:
+ ----- Method: AsyncFile>>writeBuffer:atFilePosition:onCompletionDo: (in category 'private') -----
- ----- Method: AsyncFile>>writeBuffer:atFilePosition:onCompletionDo: (in category 'as yet unclassified') -----
  writeBuffer: buffer atFilePosition: fPosition onCompletionDo: aBlock
  	"Start an operation to write the contents of the buffer at given position in this file, and fork a process to await its completion. When the write completes, evaluate the given block. Note that, since the completion block runs asynchronously, the client may need to use a SharedQueue or a semaphore for synchronization."
  
  	self primWriteStart: fileHandle
  		fPosition: fPosition
  		fromBuffer: buffer
  		at: 1
  		count: buffer size.
  	"here's the process that awaits the results:"
  	[| n |
  		[	semaphore wait.
  		  	n := self primWriteResult: fileHandle.
  		  	n = Busy.
  		] whileTrue.  "loop while busy in case the semaphore had excess signals"
  		n = ErrorCode ifTrue: [^ self error: 'asynchronous write operation failed'].
  		n = buffer size ifFalse: [^ self error: 'did not write the entire buffer'].
  		aBlock value.
  	] forkAt: Processor userInterruptPriority.
  !

Item was removed:
- ----- Method: DirectoryEntry class>>name:creationTime:modificationTime:isDirectory:fileSize: (in category 'deprecated') -----
- name: name0  creationTime: creationTime  modificationTime: modificationTime   isDirectory: isDirectory  fileSize: fileSize
- 	"This is the legacy creation method we are trying to phase out.  Please use #directory:  name:  creationTime:  modificationTime:  fileSize:." 
- 	| type |
- 	type := isDirectory 
- 		ifTrue: [ DirectoryEntryDirectory ]
- 		ifFalse: [ DirectoryEntryFile ].
- 	^ type
- 		directory: nil
- 		name: name0  
- 		creationTime: creationTime  
- 		modificationTime: modificationTime   
- 		fileSize: fileSize!

Item was changed:
+ ----- Method: FilePath class>>classVersion (in category 'accessing') -----
- ----- Method: FilePath class>>classVersion (in category 'as yet unclassified') -----
  classVersion
  
  	^ 1.
  !

Item was changed:
+ ----- Method: RemoteString class>>currentTextAttVersion (in category 'accessing') -----
- ----- Method: RemoteString class>>currentTextAttVersion (in category 'as yet unclassified') -----
  currentTextAttVersion
  	"The current configuration of the TextAttributes classes has a structures array describing the inst vars of the classes (SmartRefStream instVarInfo:).  Return tag that indexes the TextAttributeStructureVersions dictionary (4 random characters)."
  
  	^ CurrentTextAttVersion
  	"Be sure to run makeNewTextAttVersion when any TextAttributes class changes inst vars"!

Item was changed:
+ ----- Method: RemoteString class>>initialize (in category 'class initialization') -----
- ----- Method: RemoteString class>>initialize (in category 'as yet unclassified') -----
  initialize
  	"Derive the current TextAttributes classes object structure"
  
  	self new makeNewTextAttVersion!

Item was changed:
+ ----- Method: RemoteString class>>newFileNumber:position: (in category 'instance creation') -----
- ----- Method: RemoteString class>>newFileNumber:position: (in category 'as yet unclassified') -----
  newFileNumber: sourceIndex position: anInteger 
+ 	"Answer an instance of me for a file indexed by sourceIndex, at the 
- 	"Answer an instance of me fora file indexed by sourceIndex, at the 
  	position anInteger. Assume that the string is already stored on the file 
  	and the instance will be used to access it."
  
  	^self new fileNumber: sourceIndex position: anInteger!

Item was changed:
+ ----- Method: RemoteString class>>newString:onFileNumber: (in category 'instance creation') -----
- ----- Method: RemoteString class>>newString:onFileNumber: (in category 'as yet unclassified') -----
  newString: aString onFileNumber: sourceIndex 
  	"Answer an instance of me for string, aString, on file indexed by 
  	sourceIndex. Put the string on the file and create the remote reference."
  
  	^self new string: aString onFileNumber: sourceIndex!

Item was changed:
+ ----- Method: RemoteString class>>newString:onFileNumber:toFile: (in category 'instance creation') -----
- ----- Method: RemoteString class>>newString:onFileNumber:toFile: (in category 'as yet unclassified') -----
  newString: aString onFileNumber: sourceIndex toFile: aFileStream
  	"Answer an instance of me for string, aString, on file indexed by 
  	sourceIndex. Put the string on the file, aFileStream, and create the 
  	remote reference. Assume that the index corresponds properly to 
  	aFileStream."
  
  	^self new string: aString onFileNumber: sourceIndex toFile: aFileStream!

Item was changed:
+ ----- Method: RemoteString class>>structureAt: (in category 'accessing') -----
- ----- Method: RemoteString class>>structureAt: (in category 'as yet unclassified') -----
  structureAt: styleVersion
  
  	^ TextAttributeStructureVersions at: styleVersion ifAbsent: [nil]!



More information about the Squeak-dev mailing list