A new version of Files was added to project The Inbox:
http://source.squeak.org/inbox/Files-ul.139.mcz ==================== Summary ==================== Name: Files-ul.139 Author: ul Time: 24 October 2014, 3:50:04.3 am UUID: 521172db-9620-40a3-94c4-79891c268a17 Ancestors: Files-eem.138 - use the new ExternalSemaphoreTable API =============== Diff against Files-eem.138 =============== Item was changed: ----- Method: AsyncFile>>close (in category 'as yet unclassified') ----- close fileHandle ifNil: [^ self]. "already closed" self primClose: fileHandle. + ExternalSemaphoreTable unregisterExternalObject: semaphore. - Smalltalk unregisterExternalObject: semaphore. semaphore := nil. fileHandle := nil. ! Item was changed: ----- 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." - | semaIndex | name := fullFileName. writeable := aBoolean. + semaphore := ExternalSemaphoreTable newExternalSemaphore. + fileHandle := self + primOpen: name asVmPathName + forWrite: writeable + semaIndex: semaphore indexInExternalObjectsArray. - semaphore := Semaphore new. - semaIndex := Smalltalk registerExternalObject: semaphore. - fileHandle := self primOpen: name asVmPathName forWrite: writeable semaIndex: semaIndex. fileHandle ifNil: [ + ExternalSemaphoreTable unregisterExternalObject: semaphore. - Smalltalk unregisterExternalObject: semaphore. semaphore := nil. ^ nil]. ! Item was changed: ----- Method: StandardFileStream>>post:target:url:ifError: (in category 'browser requests') ----- post: data target: target url: url ifError: errorBlock "Post data to the given URL. The returned file stream contains the reply of the server. If Squeak is not running in a browser evaluate errorBlock" + | semaphore request result | - | sema index request result | self waitBrowserReadyFor: self defaultBrowserReadyWait ifFail: [^errorBlock value]. + semaphore := ExternalSemaphoreTable newExternalSemaphore. + request := self + primURLPost: url + target: target data: data + semaIndex: semaphore indexInExternalObjectsArray. - sema := Semaphore new. - index := Smalltalk registerExternalObject: sema. - request := self primURLPost: url target: target data: data semaIndex: index. request == nil ifTrue:[ + ExternalSemaphoreTable unregisterExternalObject: semaphore. - - Smalltalk unregisterExternalObject: sema. ^errorBlock value. ] ifFalse:[ + [semaphore wait. "until something happens" - [sema wait. "until something happens" result := self primURLRequestState: request. result == nil] whileTrue. result ifTrue:[fileID := self primURLRequestFileHandle: request]. self primURLRequestDestroy: request. ]. + ExternalSemaphoreTable unregisterExternalObject: semaphore. - Smalltalk unregisterExternalObject: sema. fileID == nil ifTrue:[^nil]. self register. name := url. rwmode := false. buffer1 := String new: 1. self enableReadBuffering ! Item was changed: ----- Method: StandardFileStream>>requestURL:target:ifError: (in category 'browser requests') ----- requestURL: url target: target ifError: errorBlock "Request to go to the target for the given URL. If Squeak is not running in a browser evaluate errorBlock" + | semaphore request result | - | sema index request result | self waitBrowserReadyFor: self defaultBrowserReadyWait ifFail: [^errorBlock value]. + semaphore := ExternalSemaphoreTable newExternalSemaphore. + request := self + primURLRequest: url + target: target + semaIndex: semaphore indexInExternalObjectsArray. - sema := Semaphore new. - index := Smalltalk registerExternalObject: sema. - request := self primURLRequest: url target: target semaIndex: index. request == nil ifTrue:[ + ExternalSemaphoreTable unregisterExternalObject: semaphore. - - Smalltalk unregisterExternalObject: sema. ^errorBlock value. ] ifFalse:[ + [semaphore wait. "until something happens" - [sema wait. "until something happens" result := self primURLRequestState: request. result == nil] whileTrue. self primURLRequestDestroy: request. ]. + ExternalSemaphoreTable unregisterExternalObject: semaphore. - Smalltalk unregisterExternalObject: sema. fileID == nil ifTrue:[^nil]. self register. name := url. rwmode := false. buffer1 := String new: 1. self enableReadBuffering ! Item was changed: ----- Method: StandardFileStream>>requestURLStream:ifError: (in category 'browser requests') ----- requestURLStream: url ifError: errorBlock "Request a FileStream for the given URL. If Squeak is not running in a browser evaluate errorBlock" "FileStream requestURLStream:'http://www.squeak.org'" + | semaphore request result | - | sema index request result | self waitBrowserReadyFor: self defaultBrowserReadyWait ifFail: [^errorBlock value]. + semaphore := ExternalSemaphoreTable newExternalSemaphore. + request := self + primURLRequest: url + semaIndex: semaphore indexInExternalObjectsArray. - sema := Semaphore new. - index := Smalltalk registerExternalObject: sema. - request := self primURLRequest: url semaIndex: index. request == nil ifTrue:[ + ExternalSemaphoreTable unregisterExternalObject: semaphore. - - Smalltalk unregisterExternalObject: sema. ^errorBlock value. ] ifFalse:[ + [semaphore wait. "until something happens" - [sema wait. "until something happens" result := self primURLRequestState: request. result == nil] whileTrue. result ifTrue:[fileID := self primURLRequestFileHandle: request]. self primURLRequestDestroy: request. ]. + ExternalSemaphoreTable unregisterExternalObject: semaphore. - Smalltalk unregisterExternalObject: sema. fileID == nil ifTrue:[^nil]. self register. name := url. rwmode := false. buffer1 := String new: 1. self enableReadBuffering ! |
Free forum by Nabble | Edit this page |