The Inbox: Files-ul.140.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Inbox: Files-ul.140.mcz

commits-2
A new version of Files was added to project The Inbox:
http://source.squeak.org/inbox/Files-ul.140.mcz

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

Name: Files-ul.140
Author: ul
Time: 26 October 2014, 1:45:59.442 am
UUID: fd217dff-eddb-40c4-93fa-41da16965596
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.
+ ^ExternalSemaphoreTable newExternalSemaphoreDo: [ :newSemaphore :index |
+ fileHandle := self primOpen: name asVmPathName forWrite: writeable semaIndex: index.
+ fileHandle
+ ifNotNil: [
+ semaphore := newSemaphore.
+ self ]
+ ifNil: [
+ ExternalSemaphoreTable unregisterExternalObject: newSemaphore.
+ nil ] ]!
- semaphore := Semaphore new.
- semaIndex := Smalltalk registerExternalObject: semaphore.
- fileHandle := self primOpen: name asVmPathName forWrite: writeable semaIndex: semaIndex.
- fileHandle ifNil: [
- 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"
+
- | sema index request result |
  self waitBrowserReadyFor: self defaultBrowserReadyWait ifFail: [^errorBlock value].
+ ExternalSemaphoreTable newExternalSemaphoreDo: [ :semaphore :index |
+ | request result |
+ request := self primURLPost: url target: target data: data semaIndex: index.
+ request ifNil: [
+ ExternalSemaphoreTable unregisterExternalObject: semaphore.
+ ^errorBlock value ].
+ [ semaphore wait. "until something happens"
+ result := self primURLRequestState: request.
+ result == nil ] whileTrue.
+ result ifTrue: [ fileID := self primURLRequestFileHandle: request ].
- sema := Semaphore new.
- index := Smalltalk registerExternalObject: sema.
- request := self primURLPost: url target: target data: data semaIndex: index.
- request == nil ifTrue:[
-
- Smalltalk unregisterExternalObject: sema.
- ^errorBlock value.
- ] ifFalse:[
- [sema wait. "until something happens"
- result := self primURLRequestState: request.
- result == nil] whileTrue.
- result ifTrue:[fileID := self primURLRequestFileHandle: request].
  self primURLRequestDestroy: request.
+ ExternalSemaphoreTable unregisterExternalObject: semaphore ].
+ fileID ifNil: [ ^nil ].
- ].
- Smalltalk unregisterExternalObject: sema.
- fileID == nil ifTrue:[^nil].
  self register.
  name := url.
  rwmode := false.
  buffer1 := String new: 1.
+ self enableReadBuffering!
- 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"
 
- | sema index request result |
  self waitBrowserReadyFor: self defaultBrowserReadyWait ifFail: [^errorBlock value].
+ ExternalSemaphoreTable newExternalSemaphoreDo: [ :semaphore :index |
+ | request result |
+ request := self primURLRequest: url target: target semaIndex: index.
+ request ifNil: [
+ ExternalSemaphoreTable unregisterExternalObject: semaphore.
+ ^errorBlock value ].
+ [ semaphore wait. "until something happens"
+ result := self primURLRequestState: request.
+ result == nil ] whileTrue.
- sema := Semaphore new.
- index := Smalltalk registerExternalObject: sema.
- request := self primURLRequest: url target: target semaIndex: index.
- request == nil ifTrue:[
-
- Smalltalk unregisterExternalObject: sema.
- ^errorBlock value.
- ] ifFalse:[
- [sema wait. "until something happens"
- result := self primURLRequestState: request.
- result == nil] whileTrue.
  self primURLRequestDestroy: request.
+ ExternalSemaphoreTable unregisterExternalObject: semaphore ].
+ fileID ifNil: [ ^nil ].
- ].
- Smalltalk unregisterExternalObject: sema.
- fileID == nil ifTrue:[^nil].
  self register.
  name := url.
  rwmode := false.
  buffer1 := String new: 1.
+ self enableReadBuffering!
- 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'"
+
- | sema index request result |
  self waitBrowserReadyFor: self defaultBrowserReadyWait ifFail: [^errorBlock value].
+ ExternalSemaphoreTable newExternalSemaphoreDo: [ :semaphore :index |
+ | request result |
+ request := self primURLRequest: url semaIndex: index.
+ request ifNil: [
+ ExternalSemaphoreTable unregisterExternalObject: semaphore.
+ ^errorBlock value ].
+ [ semaphore wait. "until something happens"
+ result := self primURLRequestState: request.
+ result == nil ] whileTrue.
+ result ifTrue: [ fileID := self primURLRequestFileHandle: request ].
- sema := Semaphore new.
- index := Smalltalk registerExternalObject: sema.
- request := self primURLRequest: url semaIndex: index.
- request == nil ifTrue:[
-
- Smalltalk unregisterExternalObject: sema.
- ^errorBlock value.
- ] ifFalse:[
- [sema wait. "until something happens"
- result := self primURLRequestState: request.
- result == nil] whileTrue.
- result ifTrue:[fileID := self primURLRequestFileHandle: request].
  self primURLRequestDestroy: request.
+ ExternalSemaphoreTable unregisterExternalObject: semaphore ].
+ fileID ifNil: [ ^nil ].
- ].
- Smalltalk unregisterExternalObject: sema.
- fileID == nil ifTrue:[^nil].
  self register.
  name := url.
  rwmode := false.
  buffer1 := String new: 1.
+ self enableReadBuffering!
- self enableReadBuffering
- !