Skip to content

Commit 1f43b4e

Browse files
Revert Thread-Safety (#729)
* Revert "Add tests and dev-doc" This reverts commit c42c907. * Revert "Add `TInterp_t` argument to funcs to resolve interpreter instance" This reverts commit db363c6. * Revert "Add `Cpp::TakeInterpreter`" This reverts commit da06567. * Revert "Thread-Safty: Add Mutex per Interpreter" This reverts commit d210d68.
1 parent e1e07e0 commit 1f43b4e

File tree

12 files changed

+191
-772
lines changed

12 files changed

+191
-772
lines changed

docs/DevelopersDocumentation.rst

Lines changed: 2 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -423,54 +423,12 @@ library files and run pytest:
423423
python -m pip install pytest
424424
python -m pytest -sv
425425
426-
###################################
426+
***********************************
427427
CppInterOp Internal Documentation
428-
###################################
428+
***********************************
429429

430430
CppInterOp maintains an internal Doxygen documentation of its components.
431431
Internal documentation aims to capture intrinsic details and overall usage of
432432
code components. The goal of internal documentation is to make the codebase
433433
easier to understand for the new developers. Internal documentation can be
434434
visited : `here <build/html/index.html>`_
435-
436-
**************************************
437-
Multiple Interpreter & Thread-Safety
438-
**************************************
439-
440-
CppInterOp allows the user to create multiple interpreters at a time and
441-
use those interpreters. The interpreters that are created are stored in a
442-
stack and a map. The stack is used to enable the model where the user
443-
wants to create a temporary interpreter and destroy it after performing a
444-
few operations. In such a use case, the top of the stack is the only
445-
interpreter in use at any given point in time.
446-
447-
The map is used to store the mapping from :code:`clang::ASTContext` to
448-
:code:`Cpp::InterpreterInfo`. This is required to figure out which
449-
interpreter an object belongs to. Say the library user performs the
450-
following operations:
451-
452-
1. Create an Interpreter
453-
2. Compile some code with variable :code:`a`
454-
3. Create another Interpreter
455-
4. Performs :code:`Cpp::GetVariableOffset(a)`
456-
457-
In step 4, the top of the stack is an interpreter without the definition of
458-
:code:`a`. And we cannot use it to figure out the address of :code:`a`.
459-
The :code:`clang::Decl` passed to :code:`Cpp::GetVariableOffset` is used to
460-
retrieve the :code:`clang::ASTContext`, using
461-
:code:`clang::Decl::getASTContext`. We then use the map to figure out the
462-
exact Interpreter Instance this :code:`clang::Decl` belongs to and perform
463-
the operation.
464-
465-
A shortcoming of this is that if the CppInterOp accepts a
466-
:code:`clang::QualType` instead of :code:`clang::Decl`, then it is not
467-
possible to get the :code:`clang::ASTContext` from the :code:`clang::QualType`.
468-
In such cases, we iterate over the Allocator of all the Interpreters in our
469-
stack and figure out which :code:`clang::ASTContext` allocated this
470-
:code:`clang::QualType`. This is a very expensive operation. But there is no
471-
alternative to this.
472-
473-
For **thread-safety**, we introduce a lock for each of the interpreters we
474-
create. And lock only that one specific interpreter when required. We also
475-
have 2 global locks, one for LLVM, and another is used to lock operations
476-
performed on the interpreter stack and the map itself.

include/CppInterOp/CppInterOp.h

Lines changed: 23 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ CPPINTEROP_API std::string GetQualifiedCompleteName(TCppScope_t klass);
389389
CPPINTEROP_API std::vector<TCppScope_t> GetUsingNamespaces(TCppScope_t scope);
390390

391391
/// Gets the global scope of the whole C++ instance.
392-
CPPINTEROP_API TCppScope_t GetGlobalScope(TInterp_t interp = nullptr);
392+
CPPINTEROP_API TCppScope_t GetGlobalScope();
393393

394394
/// Strips the typedef and returns the underlying class, and if the
395395
/// underlying decl is not a class it returns the input unchanged.
@@ -398,28 +398,18 @@ CPPINTEROP_API TCppScope_t GetUnderlyingScope(TCppScope_t scope);
398398
/// Gets the namespace or class (by stripping typedefs) for the name
399399
/// passed as a parameter, and if the parent is not passed,
400400
/// then global scope will be assumed.
401-
/// Looks up the name in parent, if parent is nullptr,
402-
/// interp is used to select the interpreter if multiple in-use.
403-
/// interp is ignored if parent is non-null.
404401
CPPINTEROP_API TCppScope_t GetScope(const std::string& name,
405-
TCppScope_t parent = nullptr,
406-
TInterp_t interp = nullptr);
402+
TCppScope_t parent = nullptr);
407403

408404
/// When the namespace is known, then the parent doesn't need
409405
/// to be specified. This will probably be phased-out in
410406
/// future versions of the interop library.
411-
/// interp is used to select the interpreter if multiple in-use.
412-
CPPINTEROP_API TCppScope_t GetScopeFromCompleteName(const std::string& name,
413-
TInterp_t interp = nullptr);
407+
CPPINTEROP_API TCppScope_t GetScopeFromCompleteName(const std::string& name);
414408

415409
/// This function performs a lookup within the specified parent,
416410
/// a specific named entity (functions, enums, etcetera).
417-
/// Looks up the name in parent, if parent is nullptr,
418-
/// interp is used to select the interpreter if multiple in-use.
419-
/// interp is ignored if parent is non-null.
420411
CPPINTEROP_API TCppScope_t GetNamed(const std::string& name,
421-
TCppScope_t parent = nullptr,
422-
TInterp_t interp = nullptr);
412+
TCppScope_t parent = nullptr);
423413

424414
/// Gets the parent of the scope that is passed as a parameter.
425415
CPPINTEROP_API TCppScope_t GetParentScope(TCppScope_t scope);
@@ -503,12 +493,8 @@ CPPINTEROP_API bool IsTemplatedFunction(TCppFunction_t func);
503493

504494
/// This function performs a lookup to check if there is a
505495
/// templated function of that type.
506-
/// Looks up the name in parent, if parent is nullptr,
507-
/// interp is used to select the interpreter if multiple in-use.
508-
/// interp is ignored if parent is non-null.
509496
CPPINTEROP_API bool ExistsFunctionTemplate(const std::string& name,
510-
TCppScope_t parent = nullptr,
511-
TInterp_t interp = nullptr);
497+
TCppScope_t parent = nullptr);
512498

513499
/// Sets a list of all the constructor for a scope/class that is
514500
/// supplied as a parameter.
@@ -556,8 +542,7 @@ CPPINTEROP_API bool IsDestructor(TCppConstFunction_t method);
556542
CPPINTEROP_API bool IsStaticMethod(TCppConstFunction_t method);
557543

558544
///\returns the address of the function given its potentially mangled name.
559-
CPPINTEROP_API TCppFuncAddr_t GetFunctionAddress(const char* mangled_name,
560-
TInterp_t interp = nullptr);
545+
CPPINTEROP_API TCppFuncAddr_t GetFunctionAddress(const char* mangled_name);
561546

562547
///\returns the address of the function given its function declaration.
563548
CPPINTEROP_API TCppFuncAddr_t GetFunctionAddress(TCppFunction_t method);
@@ -658,9 +643,7 @@ CPPINTEROP_API TCppType_t GetCanonicalType(TCppType_t type);
658643

659644
/// Used to either get the built-in type of the provided string, or
660645
/// use the name to lookup the actual type.
661-
/// interp is used to select the interpreter if multiple in-use.
662-
CPPINTEROP_API TCppType_t GetType(const std::string& type,
663-
TInterp_t interp = nullptr);
646+
CPPINTEROP_API TCppType_t GetType(const std::string& type);
664647

665648
///\returns the complex of the provided type.
666649
CPPINTEROP_API TCppType_t GetComplexType(TCppType_t element_type);
@@ -719,11 +702,6 @@ CreateInterpreter(const std::vector<const char*>& Args = {},
719702
///\returns false on failure or if \c I is not tracked in the stack.
720703
CPPINTEROP_API bool DeleteInterpreter(TInterp_t I = nullptr);
721704

722-
/// Take ownership of an interpreter instance.
723-
///\param[in] I - the interpreter to be taken, if nullptr, returns the last.
724-
///\returns nullptr on failure or if \c I is not tracked in the stack.
725-
CPPINTEROP_API TInterp_t TakeInterpreter(TInterp_t I = nullptr);
726-
727705
/// Activates an instance of an interpreter to handle subsequent API requests
728706
///\param[in] I - the interpreter to be activated.
729707
///\returns false on failure.
@@ -744,10 +722,10 @@ CPPINTEROP_API void UseExternalInterpreter(TInterp_t I);
744722

745723
/// Adds a Search Path for the Interpreter to get the libraries.
746724
CPPINTEROP_API void AddSearchPath(const char* dir, bool isUser = true,
747-
bool prepend = false, TInterp_t I = nullptr);
725+
bool prepend = false);
748726

749727
/// Returns the resource-dir path (for headers).
750-
CPPINTEROP_API const char* GetResourceDir(TInterp_t I = nullptr);
728+
CPPINTEROP_API const char* GetResourceDir();
751729

752730
/// Uses the underlying clang compiler to detect the resource directory.
753731
/// In essence calling clang -print-resource-dir and checks if it ends with
@@ -768,52 +746,46 @@ DetectSystemCompilerIncludePaths(std::vector<std::string>& Paths,
768746

769747
/// Secondary search path for headers, if not found using the
770748
/// GetResourceDir() function.
771-
CPPINTEROP_API void AddIncludePath(const char* dir, TInterp_t I = nullptr);
749+
CPPINTEROP_API void AddIncludePath(const char* dir);
772750

773751
// Gets the currently used include paths
774752
///\param[out] IncludePaths - the list of include paths
775753
///
776754
CPPINTEROP_API void GetIncludePaths(std::vector<std::string>& IncludePaths,
777755
bool withSystem = false,
778-
bool withFlags = false,
779-
TInterp_t I = nullptr);
756+
bool withFlags = false);
780757

781758
/// Only Declares a code snippet in \c code and does not execute it.
782759
///\returns 0 on success
783-
CPPINTEROP_API int Declare(const char* code, bool silent = false,
784-
TInterp_t I = nullptr);
760+
CPPINTEROP_API int Declare(const char* code, bool silent = false);
785761

786762
/// Declares and executes a code snippet in \c code.
787763
///\returns 0 on success
788-
CPPINTEROP_API int Process(const char* code, TInterp_t I = nullptr);
764+
CPPINTEROP_API int Process(const char* code);
789765

790766
/// Declares, executes and returns the execution result as a intptr_t.
791767
///\returns the expression results as a intptr_t.
792-
CPPINTEROP_API intptr_t Evaluate(const char* code, bool* HadError = nullptr,
793-
TInterp_t I = nullptr);
768+
CPPINTEROP_API intptr_t Evaluate(const char* code, bool* HadError = nullptr);
794769

795770
/// Looks up the library if access is enabled.
796771
///\returns the path to the library.
797-
CPPINTEROP_API std::string LookupLibrary(const char* lib_name,
798-
TInterp_t I = nullptr);
772+
CPPINTEROP_API std::string LookupLibrary(const char* lib_name);
799773

800774
/// Finds \c lib_stem considering the list of search paths and loads it by
801775
/// calling dlopen.
802776
/// \returns true on success.
803-
CPPINTEROP_API bool LoadLibrary(const char* lib_stem, bool lookup = true,
804-
TInterp_t I = nullptr);
777+
CPPINTEROP_API bool LoadLibrary(const char* lib_stem, bool lookup = true);
805778

806779
/// Finds \c lib_stem considering the list of search paths and unloads it by
807780
/// calling dlclose.
808781
/// function.
809-
CPPINTEROP_API void UnloadLibrary(const char* lib_stem, TInterp_t I = nullptr);
782+
CPPINTEROP_API void UnloadLibrary(const char* lib_stem);
810783

811784
/// Scans all libraries on the library search path for a given potentially
812785
/// mangled symbol name.
813786
///\returns the path to the first library that contains the symbol definition.
814-
CPPINTEROP_API std::string SearchLibrariesForSymbol(const char* mangled_name,
815-
bool search_system /*true*/,
816-
TInterp_t I = nullptr);
787+
CPPINTEROP_API std::string
788+
SearchLibrariesForSymbol(const char* mangled_name, bool search_system /*true*/);
817789

818790
/// Inserts or replaces a symbol in the JIT with the one provided. This is
819791
/// useful for providing our own implementations of facilities such as printf.
@@ -824,8 +796,7 @@ CPPINTEROP_API std::string SearchLibrariesForSymbol(const char* mangled_name,
824796
///
825797
///\returns true on failure.
826798
CPPINTEROP_API bool InsertOrReplaceJitSymbol(const char* linker_mangled_name,
827-
uint64_t address,
828-
TInterp_t I = nullptr);
799+
uint64_t address);
829800

830801
/// Tries to load provided objects in a string format (prettyprint).
831802
CPPINTEROP_API std::string ObjToString(const char* type, void* obj);
@@ -862,10 +833,9 @@ GetClassTemplateInstantiationArgs(TCppScope_t templ_instance,
862833

863834
/// Instantiates a function template from a given string representation. This
864835
/// function also does overload resolution.
865-
///\param[in] interp - is used to select the interpreter if multiple in-use.
866836
///\returns the instantiated function template declaration.
867-
CPPINTEROP_API TCppFunction_t InstantiateTemplateFunctionFromString(
868-
const char* function_template, TInterp_t interp = nullptr);
837+
CPPINTEROP_API TCppFunction_t
838+
InstantiateTemplateFunctionFromString(const char* function_template);
869839

870840
/// Finds best overload match based on explicit template parameters (if any)
871841
/// and argument types.
@@ -963,7 +933,7 @@ CPPINTEROP_API void CodeComplete(std::vector<std::string>& Results,
963933
/// Reverts the last N operations performed by the interpreter.
964934
///\param[in] N The number of operations to undo. Defaults to 1.
965935
///\returns 0 on success, non-zero on failure.
966-
CPPINTEROP_API int Undo(unsigned N = 1, TInterp_t interp = nullptr);
936+
CPPINTEROP_API int Undo(unsigned N = 1);
967937

968938
} // end namespace Cpp
969939

0 commit comments

Comments
 (0)