On Tue, Feb 27, 2024 at 9:31 AM Namhyung Kim <namhyung@xxxxxxxxxx> wrote: > > On Mon, Feb 26, 2024 at 11:24 PM Ian Rogers <irogers@xxxxxxxxxx> wrote: > > > > On Mon, Feb 26, 2024 at 11:07 PM Namhyung Kim <namhyung@xxxxxxxxxx> wrote: > > > > > > On Tue, Feb 13, 2024 at 10:37 PM Ian Rogers <irogers@xxxxxxxxxx> wrote: > > > > > > > > Move threads out of machine and move thread_rb_node into the C > > > > file. This hides the implementation of threads from the rest of the > > > > code allowing for it to be refactored. > > > > > > > > Locking discipline is tightened up in this change. > > > > > > Doesn't look like a simple code move. Can we split the locking > > > change from the move to make the reviewer's life a bit easier? :) > > > > Not sure I follow. Take threads_nr as an example. > > > > The old code is in machine.c, so: > > -static size_t machine__threads_nr(const struct machine *machine) > > -{ > > - size_t nr = 0; > > - > > - for (int i = 0; i < THREADS__TABLE_SIZE; i++) > > - nr += machine->threads[i].nr; > > - > > - return nr; > > -} > > > > The new code is in threads.c: > > +size_t threads__nr(struct threads *threads) > > +{ > > + size_t nr = 0; > > + > > + for (int i = 0; i < THREADS__TABLE_SIZE; i++) { > > + struct threads_table_entry *table = &threads->table[i]; > > + > > + down_read(&table->lock); > > + nr += table->nr; > > + up_read(&table->lock); > > + } > > + return nr; > > +} > > > > So it is a copy paste from one file to the other. The only difference > > is that the old code failed to take a lock when reading "nr" so the > > locking is added. I wanted to make sure all the functions in threads.c > > were properly correct wrt locking, semaphore creation and destruction, > > etc. We could have a broken threads.c and fix it in the next change, > > but given that's a bug it could make bisection more difficult. > > Ultimately I thought the locking changes were small enough to not > > warrant being on their own compared to the advantages of having a sane > > threads abstraction. > > I can see some other differences like machine__findnew_thread() > which I think is due to the locking change. Maybe we can fix the > problem before moving the code and let the code move simple. I'll see what I can split out in v2. I don't think findnew will change and the nr change is trivial. In the previous code the lock is taken before calling __machine__findnew_thread, which doesn't make sense when we try to abstract inside of threads, where it should take/release the lock in the threads and not the machine code. Moving the lock to __machine__findnew_thread doesn't really make sense as the __ implies the lock is already held. Thanks, Ian > Thanks, > Namhyung