On Jul 11, 2011, at 7:28 AM, George Bosilca wrote: >> How about a compromise? > > Based on the english dictionary a compromise is an agreement or a settlement > of a dispute that is reached by each side making concessions. This is not a > compromise. This is exactly what Ralph did plus name changes. Therefore, this > is a single sided settlement.
Actually, it gives you what you wanted, too (i.e., the ability to separately init/finalize OPAL util vs. the rest of OPAL). Hence, it's a compromise. >> - Take what is (essentially) in opal_init() today and rename it to be >> opal_init_frameworks() -- because it's (mostly) initializing the OPAL MCA >> frameworks. >> >> - Take what is (essentially) in opal_finalize() today and rename it to be >> opal_finalize_frameworks() -- because it's (mostly) finalizing the OPAL MCA >> frameworks. Remove the call to opal_finalize_util() from this function. >> >> - Remove all use of counters; calling opal_init*() will initialize (unless >> it has already been initialized), and calling opal_finalize*() will finalize >> (unless it has already been finalized). >> >> - Create a new opal_init() function that is a wrapper around >> opal_init_util() and opal_init_frameworks(). Create a new opal_finalize() >> function that is a wrapper around opal_finalize_util() and >> opal_finalize_frameworks(). >> >> - orte_finalize() will call opal_finalize() -- i.e., it will unconditionally >> shut down all of OPAL. This will remove the need for opal_finalize_util() >> in the MPI layer. >> >> This seems to give all desired behaviors: >> >> - All <foo>_finalize() functions will be unconditional. The Law of Least >> Surprise is preserved. >> >> - There are paths for split init and split finalize and combined init and >> combined finalize. They can even be combined (e.g., split init and combined >> finalize -- which will be a common case, actually). > > Least surprise you say? How surprise one will be once he/she realize that > orte_finalize teared down all OPAL. At least, do not forget to add one of > those nice comments about the fact that one have to initialize the utils, but > don't have to finalize them, ORTE will graciously do it for you. To clarify: you can *choose* to separately initialize the OPAL utilities if you want/need to. Otherwise, the lower layer -- ORTE -- will both initialize and finalize OPAL for you. Isn't that what lower layers are supposed to do? OPAL has a weird "side entrance" because we need to use some of OPAL (MCA params) before the rest of the system. *That's* the weird part. We actually somewhat violate abstraction barriers there, IMHO (but I don't know any way around that). > You want to change names, OK go for it. At the point where the code is today, > I don't think it really matters anymore. In fact why do we need a boolean in > the code Ralph put inside? If the opal_finalize is supposed to clean up > everything just go ahead and remove that useless bool. And as you made the > code easy to understand by few, put a big comment for all the others Do you really find this confusing? int opal_finalize(void) { if (!opal_initialized) { return OPAL_SUCCESS; } ... FWIW, we have similar patterns elsewhere in OMPI for preventing multiple initializations / finalizations. Are you saying that we should remove all of those, too? > (the ones that will try to understand why their code break after a simple > orte_finalize). Can you cite any codes that will break if OPAL is finalized during orte_finalize()? I thought you said in a prior mail on this thread that no one uses OPAL after orte_finalize() anyway -- we *might* want to in the future, but no one does it today. Am I remembering incorrectly? -- Jeff Squyres jsquy...@cisco.com For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/