[petsc-dev] Internal and external symbols

Barry Smith bsmith at mcs.anl.gov
Tue Mar 5 17:34:22 CST 2013

On Mar 5, 2013, at 5:32 PM, Jed Brown <jedbrown at mcs.anl.gov> wrote:

> On Tue, Mar 5, 2013 at 5:21 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:
>   Please don't make any other changes along this line for right now. I have to merge my changes (removal/improvement of EXTERN_C_BEGIN/END) everywhere and test on many combinations of c/c++, dynamic, split libraries and push before you can make more changes.  It is a little hairy.
> Sure, push to a private branch if you want help merging.

   I have no idea what a branch is, nor even more a private branch is?

   All I know is that branches in hg cause lots of arguments between Sean, Jed, and Matt.


> On Mar 5, 2013, at 11:09 AM, Jed Brown <jedbrown at mcs.anl.gov> wrote:
> >
> > PETSC_INTERN_C is for functions with internal visibility that must use the `extern "C"` calling convention. Normally this is any symbol passed to a dynamic registration function.
>     At times I've wanted to split the PETSc library into two (or more) parts. The "interface" library, that contains functions users call directly like KSPSetType(), KSPGMRESSetRestart() and the actual implementations, like KPSCreate_GMRES(), KSPGMRESSetRestart_GMRES(), these would be loaded dynamically.  Hence I've kept the dynamic registration functions as PETSC_EXTERN_C, not PETSC_INTERN_C.   This "may" be a way to handle different precisions, complexity in the same application also if we can figure out how to put each implementation (for different precision, complexity) in a separate dynamically loaded library and load several at a time (without symbol conflict).
> Sure, that's an interesting direction. There are still quite a few interface functions that pass scalars along and I don't see a clean resolution to that part, but this direction is good to keep in mind. That said, it would be pretty easy to batch-change PETSC_INTERN_C .* XCreate_Y instances to PETSC_EXTERN_C.
> We don't have the Windows Problem (need for long-term binary stability when users abuse private interfaces) so I'm not worried about having a few private functions that users shouldn't call, but that still have exported symbols. I put in PETSC_INTERN* because cutting the number of exported symbols in half seemed substantial enough.

More information about the petsc-dev mailing list