This is a first implementation of the owner of records concept in rwlocks. It allows to avoid the priority inversion problem in the current rwlocks implementation (for readers). The main idea (that John and I discussed) is to have as owner of records the first rlock'er for a "class contention". The implementation consists in adding two flags (RW_LOCK_OWNED and RW_LOCK_EXEMPTED) which are used in order to not penalyze the easy case, and syncronizing the operation of acquiring and dropping the owner of records with the turnstile spin-lock. The main scheme might work in this way: thread1::rlock() -> sets the owner of records thread2::rlock() -> checks for RW_LOCK_OWNED bit and, if it is set, go in the easy case thread3::rlock() -> checks for RW_LOCK_OWNED... thread4::wlock() -> blocks and land its priority to thread1 thread1::runlock() -> disable the owner of records (disowning the associated turnstile) and sets the RW_LOCK_EXEMPTED flag. In this way other threads will treact as an easy case. ... What I actually need is a testing suite for heavy-load contentions, since I would like to detect eventual races I missed, etc. If somebody has a get-ready testing suite, please, let me know. The patch against HEAD is here: http://users.gufi.org/~rookie/works/patches/rwlocks.diff Please, this is not intended to be a final implementation for this, since I think that it can be improved; it is just a starting point for ongoing works and improvements. Let me know if something is not clear. Feedbacks, comments, ideas are welcome. Thanks, Attilio -- Peace can only be achieved by understanding - A. EinsteinReceived on Mon Aug 07 2006 - 17:29:17 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:58 UTC