Griffin.Framework
Griffin.Framework copied to clipboard
Fixed unhandled SemaphoreFullException when messages arrive while ReceiveAsync is still executing
_readSemaphore has been replaced with _readEvent, because an event can be safely Set multiple times in a row, while semaphore can be unintentionally Release'ed beyond its maximum level. When server sends messages faster than the client reads, and OnChannelMessageReceived is called while ReceiveAsync is still executing, the _readSemaphore is Release'ed twice -- first in on OnChannelMessageReceived, then second time at the end of ReceiveAsync (because readItems.Count > 0) which lead to unhandled SemaphoreFullException in ReceiveAsync
The offending data flow:
- OnChannelMessageReceived (readSemaphore.Release()) ----- readSemaphore.Count == 1
- WaitOne is triggered at the beginning of ReceiveAsync ----- readSemaphore.Count == 0
- Another OnChannelMessageReceived (readSemaphore.Release()) --- readSemaphoreCount == 1
- End of ReceiveAsync (if (_readItems.Count > 0) readSemaphore.Release()) -- readSemaphoreCount == 2 -- SemaphoreFullException
Any news about this pull request? I had experienced the same problem while testing my webserver with jMeter.
I made a quick and dirty fix removing this line But I don't know any possible consequences.
Hello, I have the same problem, is there any update on this?
I'm working on a new network stack. Completely async and rewritten from scratch.