-
Notifications
You must be signed in to change notification settings - Fork 32
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
MacOS Support #27
base: main
Are you sure you want to change the base?
MacOS Support #27
Changes from all commits
9584076
f003b4e
4bc3a10
f8a6cd1
da12281
62b8b07
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -142,7 +142,36 @@ internal static unsafe IntPtr CreateObject(int InTypeID, Bool32 InWeakRef, IntPt | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var handle = GCHandle.Alloc(result, InWeakRef ? GCHandleType.Weak : GCHandleType.Normal); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#if DEBUG | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
AssemblyLoader.RegisterHandle(type.Assembly, handle); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#endif | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return GCHandle.ToIntPtr(handle); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
catch (Exception ex) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
HandleException(ex); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return IntPtr.Zero; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[UnmanagedCallersOnly] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
internal static unsafe IntPtr CopyObject(IntPtr InObjectHandle) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var target = GCHandle.FromIntPtr(InObjectHandle).Target; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (target == null) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
LogMessage($"Cannot copy object with handle {InObjectHandle}. Target was null.", MessageLevel.Error); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return IntPtr.Zero; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var handle = GCHandle.Alloc(target, GCHandleType.Normal); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#if DEBUG | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var type = target.GetType(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
AssemblyLoader.RegisterHandle(type.Assembly, handle); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#endif | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+157
to
+174
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Potential misnomer: The Apply this diff to rename the method for clarity: -internal static unsafe IntPtr CopyObject(IntPtr InObjectHandle)
+internal static unsafe IntPtr DuplicateHandle(IntPtr InObjectHandle) 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return GCHandle.ToIntPtr(handle); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
catch (Exception ex) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -157,7 +186,14 @@ internal static void DestroyObject(IntPtr InObjectHandle) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GCHandle.FromIntPtr(InObjectHandle).Free(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GCHandle handle = GCHandle.FromIntPtr(InObjectHandle); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#if DEBUG | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var type = handle.Target?.GetType(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (type is not null) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
AssemblyLoader.DeregisterHandle(type.Assembly, handle); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#endif | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
handle.Free(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
catch (Exception ex) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -33,6 +33,20 @@ namespace Coral { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return result; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static Array New(const void* buffer, size_t size) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Array<TValue> result; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (buffer) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
result.m_Ptr = static_cast<TValue*>(Memory::AllocHGlobal(size)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
result.m_Length = static_cast<int32_t>(size); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
memcpy(result.m_Ptr, buffer, size); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return result; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+36
to
+48
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add null check validation for Memory::AllocHGlobal The allocation could fail, especially with large buffers. MacOS memory pressure situations should be handled gracefully. Add allocation validation: static Array New(const void* buffer, size_t size)
{
Array<TValue> result;
if (buffer)
{
result.m_Ptr = static_cast<TValue*>(Memory::AllocHGlobal(size));
+ if (!result.m_Ptr)
+ throw std::bad_alloc();
+
result.m_Length = static_cast<int32_t>(size);
memcpy(result.m_Ptr, buffer, size);
}
return result;
} 📝 Committable suggestion
Suggested change
Add size validation to ensure type safety The new method accepts a raw buffer and size without validating if the size is a multiple of sizeof(TValue). This could lead to buffer overruns or truncated data, especially critical on MacOS where memory alignment is strictly enforced. Consider this safer implementation: static Array New(const void* buffer, size_t size)
{
Array<TValue> result;
if (buffer)
{
+ if (size % sizeof(TValue) != 0)
+ throw std::invalid_argument("Buffer size must be a multiple of sizeof(TValue)");
+
+ size_t elementCount = size / sizeof(TValue);
- result.m_Ptr = static_cast<TValue*>(Memory::AllocHGlobal(size));
- result.m_Length = static_cast<int32_t>(size);
+ result.m_Ptr = static_cast<TValue*>(Memory::AllocHGlobal(size));
+ result.m_Length = static_cast<int32_t>(elementCount);
memcpy(result.m_Ptr, buffer, size);
}
return result;
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static Array New(std::initializer_list<TValue> InValues) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Array result; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -2,7 +2,7 @@ | |||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
#include <string_view> | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
#ifdef CORAL_WINDOWS | ||||||||||||||||||||||||||||||||||
#if defined(CORAL_WINDOWS) | ||||||||||||||||||||||||||||||||||
#define CORAL_CALLTYPE __cdecl | ||||||||||||||||||||||||||||||||||
#define CORAL_HOSTFXR_NAME "hostfxr.dll" | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
|
@@ -19,13 +19,22 @@ | |||||||||||||||||||||||||||||||||
using CharType = unsigned short; | ||||||||||||||||||||||||||||||||||
using StringView = std::string_view; | ||||||||||||||||||||||||||||||||||
#endif | ||||||||||||||||||||||||||||||||||
#else | ||||||||||||||||||||||||||||||||||
#elif defined(CORAL_LINUX) | ||||||||||||||||||||||||||||||||||
#define CORAL_CALLTYPE | ||||||||||||||||||||||||||||||||||
#define CORAL_STR(s) s | ||||||||||||||||||||||||||||||||||
#define CORAL_HOSTFXR_NAME "libhostfxr.so" | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
using CharType = char; | ||||||||||||||||||||||||||||||||||
using StringView = std::string_view; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
#else | ||||||||||||||||||||||||||||||||||
#define CORAL_CALLTYPE | ||||||||||||||||||||||||||||||||||
#define CORAL_STR(s) s | ||||||||||||||||||||||||||||||||||
#define CORAL_HOSTFXR_NAME "libhostfxr.dylib" | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
using CharType = char; | ||||||||||||||||||||||||||||||||||
using StringView = std::string_view; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
Comment on lines
+30
to
+37
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add explicit MacOS platform check Using Replace the -#else
+#elif defined(CORAL_MACOS)
#define CORAL_CALLTYPE
#define CORAL_STR(s) s
#define CORAL_HOSTFXR_NAME "libhostfxr.dylib"
using CharType = char;
using StringView = std::string_view;
+#else
+ #error "Unsupported platform" 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||
#endif | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
#define CORAL_DOTNET_TARGET_VERSION_MAJOR 8 | ||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Ensure thread safety when accessing
s_AllocatedHandles
The
s_AllocatedHandles
dictionary may be accessed by multiple threads, potentially leading to race conditions or data corruption. Consider using a thread-safe collection likeConcurrentDictionary<int, List<GCHandle>>
or implement proper synchronization when accessing this shared resource.