From: Jeremy F. <je...@go...> - 2002-10-22 07:35:37
|
On Mon, 2002-10-21 at 21:45, Julian Seward wrote: Nick: I spotted the infamous (?) VG_(get_current_tid_1_if_root) and specifically this: if (0 == vg_tid_currently_in_baseBlock) return 1; /* root thread */ What's the meaning of the 0 here? Where is it set? AFAICS the only valid values of vg_tid_currently_in_baseBlock are either 1 .. VG_N_THREADS or VG_INVALID_THREADID, so I guess I'm missing something here? No, I don't think so. I don't think that function means anything at all. I was very close to removing it altogether. I don't feel like I'm seeing a consistent story I'm happy with re vg_tid_currently_in_baseBlock -- can you two clarify? I put the stronger assert into save_thread_state() because I couldn't see any good reason why the tid argument should ever mismatch the value of vg_tid_currently_in_baseBlock. The assertion failed on the first thread create, but I think my fix makes sense. Thread creation copies the parent thread's context into the child via the baseBlock. In a sense the ownership of the baseBlock changes during the copy, which is what the assignment to vg_tid_currently_in_baseBlock indicates: VG_(load_thread_state)(parent_tid); /* load parent thread state into baseBlock */ + vg_tid_currently_in_baseBlock = tid; /* give ownership of baseBlock to child */ VG_(save_thread_state)(tid); /* save new state into new thread */ It seems like, with that change, it will be impossible to know from the value of vg_tid_currently_in_baseBlock whether or not baseBlock is "full". No, because save_thread_state() assigns vg_tid_currently_in_baseBlock withVG_INVALID_THREADID, so you know the baseBlock contains nothing afterwards. It gets reassigned with a valid tid on load_thread_state(). J |