This is a fairly intrusive change, but outside of the moving of opal/event to opal/mca/event, the only changes involved (a) changing all calls to opal_event functions to reflect the new framework instead, and (b) ensuring that all opal_event_t objects are properly constructed since they are now true opal_objects.
Note: Shiqing has just returned from vacation and has not yet had a chance to complete the Windows integration. Thus, this commit almost certainly breaks Windows support on the trunk. However, I want this to have a chance to soak for as long as possible before I become less available a week from today (going to be at a class for 5 days, and thus will only be sparingly available) so we can find and fix any problems.
Biggest change is moving the libevent code from opal/event to a new opal/mca/event framework. This was done to make it much easier to update libevent in the future. New versions can be inserted as a new component and tested in parallel with the current version until validated, then we can remove the earlier version if we so choose. This is a statically built framework ala installdirs, so only one component will build at a time. There is no selection logic - the sole compiled component simply loads its function pointers into the opal_event struct.
I have gone thru the code base and converted all the libevent calls I could find. However, I cannot compile nor test every environment. It is therefore quite likely that errors remain in the system. Please keep an eye open for two things:
1. compile-time errors: these will be obvious as calls to the old functions (e.g., opal_evtimer_new) must be replaced by the new framework APIs (e.g., opal_event.evtimer_new)
2. run-time errors: these will likely show up as segfaults due to missing constructors on opal_event_t objects. It appears that it became a typical practice for people to "init" an opal_event_t by simply using memset to zero it out. This will no longer work - you must either OBJ_NEW or OBJ_CONSTRUCT an opal_event_t. I tried to catch these cases, but may have missed some. Believe me, you'll know when you hit it.
There is also the issue of the new libevent "no recursion" behavior. As I described on a recent email, we will have to discuss this and figure out what, if anything, we need to do.
This commit was SVN r23925.
status structure or the _ucount field in the status structure.
On 64-bit sparc, the macros resolve into integer array assignments.
For all others, they are just simple assignments. This fixes
possible BUS errors seen when running on the SPARC processor.
This bug was introduced when the _count field changed from an int
into a size_t. See the changes to request.h for additional details.
This commit fixes trac:2514.
This commit was SVN r23554.
The following Trac tickets were found above:
Ticket 2514 --> https://svn.open-mpi.org/trac/ompi/ticket/2514
OMPI_* to OPAL_*. This allows opal layer to be used more independent
from the whole of ompi.
NOTE: 9 "svn mv" operations immediately follow this commit.
This commit was SVN r21180.
correctly in case of MPI_PROC_NULL with persistent requests.
As of r12339, the req_status of the request is initialized
correclty and being used in {{{ompi_request_test}}} and
{{{ompi_request_wait}}}.
So, just set the status, getting rid of the if-statement.
Checked by Jeff using mtt.
This commit was SVN r19485.
The following SVN revision numbers were found above:
r12339 --> open-mpi/ompi@020efdf1f9
* Add specific comments about why we're not setting MPI_ERROR here
This commit was SVN r18616.
The following SVN revision numbers were found above:
r18067 --> open-mpi/ompi@58e31d767e
A new global structure (ompi_request_functions) holding all the pointers to the wait/test functions have been added. ompi_request_wait* and ompi_request_test* have been #defined to be replaced by ompi_request_functions.req_wait. The default implementations of the wait/test functions names have been changed from ompi_request_% to ompi_request_default_%. Those functions are static initializer of the ompi_request_functions structure.
To modify the defaults, a components 1) copy the ompi_request_functions structure (the type ompi_request_fns_t can be used to declare a suitable variable), 2) change some of the functions according to its needs. This is best done at MPI_init time when there is no threads. Should this component be unloaded it have to restore the defaults. The ompi_request_default_* functions should never be called directly anywhere in the code. If a component needs to access the previously defined implementation of wait, it should call its local copy of the function. Component implementors should keep in mind that another component might have already changed the defaults and needs to be called.
This commit was SVN r16862.
This merge adds Checkpoint/Restart support to Open MPI. The initial
frameworks and components support a LAM/MPI-like implementation.
This commit follows the risk assessment presented to the Open MPI core
development group on Feb. 22, 2007.
This commit closes trac:158
More details to follow.
This commit was SVN r14051.
The following SVN revisions from the original message are invalid or
inconsistent and therefore were not cross-referenced:
r13912
The following Trac tickets were found above:
Ticket 158 --> https://svn.open-mpi.org/trac/ompi/ticket/158
This commit fixes several aspects regarding MPI conformance of requests.
* Eliminate the last argument of ompi_errhandler_request_invoke(); we
''always'' want to invoke the back-end exception handler with the
real error code.
* Make it clear in comments that we only invoke the ''first''
exception in a given array of requests, even if there's more than
one request with a non-MPI_SUCCESS value for MPI_ERROR.
* Defer the freeing of requests upon exception in the back-end
functions to MPI_WAIT* and MPI_TEST* until later; the requests are
kept so that we know what handler to invoke when we actually invoke
the exception. After figuring that out, ''then'' we free requests
with pending exceptions on them.
* Clean up return codes from the back-end MPI_TEST* and MPI_WAIT*
functions.
* Slightly modify ompi_errcode_get_mpi_code() to return unity if it
receives an MPI error code (vs. an OMPI error code).
This commit was SVN r12810.
The following Trac tickets were found above:
Ticket 659 --> https://svn.open-mpi.org/trac/ompi/ticket/659
* Add some more error checking to GREQUEST_START
* Move the error checking in GREQUEST_COMPLETE up to inside the
MPI_PARAM_CHECK block, where it belongs
* Invoke the gen request query_fn in all the Right spots (per MPI-2:8.2)
* Distinguish between grequests created from C and Fortran
* Use the OBJ system to reference count to release the grequest at
the Right time and invoke the grequest free_fn properly (see
lengthy comment in grequest.c above the destructor)
* Have ompi_grequest_complete() call ompi_request_complete() rather
than [poorly] copy the contents of ompi_request_complete()
* Fix Fortran function callback pointer typedefs to use proper
Fortran types
* Edit ompi_request_test* and ompi_request_wait* to properly handle
generalized requests. This adds an "if" statement in the critical
path for all the back-end test* and wait* functions :-(,
but fortunately George took out two "if" statements from the
critical path last week. So we're still ahead. :-)
* Move ompi_request_test() out of request.h and into request.c (all
other test* and wait* functions were already in the .c file -- and
ompi_request_test() was too long to be statically inlined anyway)
This commit was SVN r12402.
The following Trac tickets were found above:
Ticket 496 --> https://svn.open-mpi.org/trac/ompi/ticket/496
functions MPI_Test, MPI_Testany, MPI_Wait, MPI_Waitany
should not reset the status.MPI_ERROR as passed by user.
- This needed implementing the MPI_Waitsome and MPI_Testsome.
This commit was SVN r10980.
MPI_WAIT, MPI_TEST, MPI_WAITANY, and MPI_TESTANY. It isn't really
clear what the standard wants as the return code for these functions,
and this is what Sun MPI, LAM/MPI, and MPICH2 all do.
Fixes trac:172
This commit was SVN r10872.
The following Trac tickets were found above:
Ticket 172 --> https://svn.open-mpi.org/trac/ompi/ticket/172
to let the PML (or io, more generally the low level request manager)
to have it's own release function (what was before the req_fini). This
function will only be called from the low level while the req_free will
be called from the upper level (MPI layer) in order to mark the request
as not used by the user anymore.
From the request point of view the requests will be marked as inactive
everytime we read their status (true for persistent as well). As
MPI_REQUEST_NULL is already marked as inactive, the test and wait functions
are simpler. The drawback is that now we have to change in the
ompi_request_{test|wait} the req_status of the request once we get it's
status.
This commit was SVN r9290.
- move files out of toplevel include/ and etc/, moving it into the
sub-projects
- rather than including config headers with <project>/include,
have them as <project>
- require all headers to be included with a project prefix, with
the exception of the config headers ({opal,orte,ompi}_config.h
mpi.h, and mpif.h)
This commit was SVN r8985.
- Test for MPI_REQUEST_NULL within the often executed loop not
necessary, but left as a comment
- The req_fini may potentially return an error, do check for it in
req_wait.
This commit was SVN r8488.
the page address three situations:
1. if the array of requests are all REQUEST_NULL, set flag=true and
index=MPI_UNDEFINED
2. if the array of requests are not all REQUEST_NULL, if any of them
finished, set flag=true and index=whatever_the_index_was
3. if the array of requests are not all REQUEST_NULL, if none of them
finished, set flag=false and index=MPI_UNDEFINED
With regards to the index value, we are currently doing 1 and 2, but
not 3. More specifically, index should be set to MPI_UNDEFINED if no
requests are found to have completed (regardless of whether they are
REQUEST_NULL or not).
This patch fixes this problem.
This commit was SVN r8319.