semaphores do not access like volatile

diegogomezdeck at consultar.com diegogomezdeck at consultar.com
Mon Feb 10 12:23:45 UTC 2003


How are you creating the Semaphore? with #forMutualExclusion message?

Diego Gomez Deck

> Am Montag, 10. Februar 2003 12:06 schrieb diegogomezdeck at consultar.com:
>
>> Are you signaling the semaphore before changing the "results"
>> variable?
>
> Yeis.
>> Can you atach a piece of code with the problem?
>
> I'll try.
>
> first, this method creates the reading thread:
> initializeThreading
> 	| ws |
> 	readProc _ [[(Delay forMilliseconds: 100) wait.
> 			ws _ WriteStream
> 						on: (String new: 4000).
> 			[socket dataAvailable]
> 				whileTrue: [ws nextPutAll: socket getData
asString].
> 			ws size > 0
> 				ifTrue: [self processIncoming: ws contents.
> 					semaphore signal]] repeat]
> 				forkAt: Processor userInterruptPriority - 10
>
> important here is processIncoming. it does this:
>
> processIncoming: aString
> 	"Check if the stream is closing (see checkIfClosingAndRepair), and
> 	then   put the data into its channels.
> 	If it is closing, disconnect after processing."
> 	[snip]
> 	doc _ XMLDOMParser parseDocumentFrom: xmlString readStream.
> 	self assert: doc elements size = 1.
> 	el _ doc elements anyOne.
> 	el name caseOf: {
> 		[#stream:stream] -> [self verifyProtocol: el attributes].
> 		[#iq] -> [self channel: #iq add: el].
> 		[#stream:error] -> [self channel: #stream:error add: el]}
> 		 otherwise: [self error: el name asString , ' is unknown!'].
> 	closing
> 		ifTrue: [self disconnect]
>
> disconnect btw calls terminate on its own process.
>
> so, obviously, in every every case, the channels variable was modified
> before  calling signal.
>
> I read it like this:
>
> authenticateName: name password: pwd resource: rsc
> 	| el |
> 	self send: [snip authenticate me].
> 	semaphore wait.
> 	"(Delay forMilliseconds: 1000) wait." <-- uncommenting this brings
it
> 	to work el _ (channels at: #iq) last.
> 	(el attributes at: #type)
> 			= #error
> 		ifTrue: [AuthenticationException
> 				signalWithQuery: (el firstTagNamed: #query)]
>
> But even with incorrect password, the error doesnt arrive in channels
> fast  enough to give an authentication exception.
>
> hope i cleared it. i tried to make a shorter snippet to let it fail,
> but it  worked fine there.
>
> regards,
>
> nick
> - --
> "Rembrandt's first name was Beauregard, which is why he never used it."
> 		-- Dave Barry





More information about the Squeak-dev mailing list