adamreeve commented on code in PR #34133:
URL: https://github.com/apache/arrow/pull/34133#discussion_r1133322009


##########
csharp/src/Apache.Arrow/C/CArrowSchema.cs:
##########
@@ -0,0 +1,122 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+using System;
+using System.Runtime.InteropServices;
+using Apache.Arrow.Types;
+
+namespace Apache.Arrow.C
+{
+    /// <summary>
+    /// An Arrow C Data Interface Schema, which represents a type, field, or 
schema.
+    /// </summary>
+    /// 
+    /// <remarks>
+    /// This is used to export <see cref="ArrowType"/>, <see cref="Field"/>, or
+    /// <see cref="Schema"/> to other languages. It matches the layout of the
+    /// ArrowSchema struct described in 
https://github.com/apache/arrow/blob/main/cpp/src/arrow/c/abi.h.
+    /// </remarks>
+    [StructLayout(LayoutKind.Sequential)]
+    public unsafe struct CArrowSchema
+    {
+        public byte* format;
+        public byte* name;
+        public byte* metadata;
+        public long flags;
+        public long n_children;
+        public CArrowSchema** children;
+        public CArrowSchema* dictionary;
+        public delegate* unmanaged[Stdcall]<CArrowSchema*, void> release;
+        public void* private_data;
+
+
+        public static unsafe CArrowSchema* New()
+        {
+            var ptr = 
(CArrowSchema*)Marshal.AllocHGlobal(Marshal.SizeOf<CArrowSchema>());

Review Comment:
   Hi @eerhardt, would you mind explaining this a bit more? I would have 
thought that `Marshal.SizeOf` is the correct approach here as we want to know 
the size of the marshaled representation. In this case we might be lucky that 
this matches the size of the struct in managed memory as the struct only 
contains pointers and longs, and we don't need to worry about any ordering 
differences as all the members have the same size. I'd be concerned about 
future changes altering the struct representation and breaking this assumption, 
although that does seem unlikely. And I don't think we can assume applications 
will use NativeAOT or Trimming?
   
   We could store the size in a static member if we want to avoid the overhead 
of the `Marshal.SizeOf` call each time, or just hard-code the size as a 
constant and add a check that this matches the marshaled size somewhere. I 
guess even just adding a test that `sizeof(CArrowSchema) == 
Marshal.SizeOf<CArrowSchema>()` would alleviate my concerns.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to