arrow-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Matt Youill <matt.you...@airmettle.com>
Subject Re: c/c++ interop
Date Wed, 17 Feb 2021 03:42:09 GMT
can't really make the complete project available at present. That said, 
what you've done below (test.cpp) works for me as well. The difference 
is when I test from a c program (i.e test.c).

On 17/2/21 12:29 pm, Sutou Kouhei wrote:
> Hi,
>
> Could you provide a complete project that reproduces this
> case? (For example, you create a GitHub repository,
> prepare the repository to reproduces this case and share it
> to us.)
>
> I couldn't reproduce with the following:
>
> test_stream.h:
>
> #include <arrow-glib/arrow-glib.hpp>
>
> class test_stream: public ::arrow::RecordBatchReader {
> public:
>    std::shared_ptr<::arrow::Schema> schema() const override {
>      return ::arrow::schema({::arrow::field("a", arrow::int32())});
>    }
>
>    arrow::Status ReadNext(std::shared_ptr<::arrow::RecordBatch> *batch)
>      override {
>      return arrow::Status::OK();
>    }
> };
>
> extern "C" GArrowRecordBatchReader* make_test_stream(){
>    std::shared_ptr<::arrow::RecordBatchReader> ts =
>      std::make_shared<test_stream>();
>    return garrow_record_batch_reader_new_raw(&ts);
> }
>
> test.cpp:
>
> #include "test_stream.h"
>
> int
> main(void)
> {
>    GArrowRecordBatchReader *ts = make_test_stream();
>    GArrowSchema *schema = garrow_record_batch_reader_get_schema(ts);
>    g_object_unref(schema);
>    g_object_unref(ts);
>    return 0;
> }
>
> Command lines:
>
> $ g++ test.cpp $(pkg-config --cflags --libs arrow-glib)
> $ ./a.out
>
>
> Thanks,
> --
> kou
>
> In <e09d8c7a-0e52-e5e3-8d93-0b8016f298b7@airmettle.com>
>    "c/c++ interop" on Wed, 17 Feb 2021 12:09:37 +1100,
>    Matt Youill <matt.youill@airmettle.com> wrote:
>
>> Hi,
>>
>> I'm not super familiar with glib and currently have an issue with the
>> arrows cglib lib.
>>
>> I have some C++ code that creates a subclass of RecordBatchReader
>> (test_stream), and returns it to some C code as a
>> GArrowRecordBatchReader *.
>>
>> If I run the same code in C++ it runs fine, but in C I always get a
>> segmentation fault when performing an operation on the returned
>> GArrowRecordBatchReader *.
>>
>> test_stream doesn't really do anything other than return a dummy
>> schema (it's just a test).
>>
>>
>> Sample code:
>>
>> *test_stream.h*
>>
>>
>> class test_stream: public ::arrow::RecordBatchReader {
>>
>>   public:
>>    std::shared_ptr<::arrow::Schema> schema() const override {
>>      return ::arrow::schema({::arrow::field("a", arrow::int32())});
>>    }
>>
>>    arrow::Status ReadNext(std::shared_ptr<::arrow::RecordBatch> *batch)
>> override {
>>      return arrow::Status::OK();
>>    }
>>
>> };
>>
>> extern "C" GArrowRecordBatchReader* make_test_stream(){
>>    std::shared_ptr<::arrow::RecordBatchReader> ts =
>> std::make_shared<test_stream>();
>>    return garrow_record_batch_reader_new_raw(&ts);
>> }
>>
>>
>> *test.c (or test.cpp)*
>>
>> GArrowRecordBatchReader *ts = make_test_stream();
>> GArrowSchema *schema = garrow_record_batch_reader_get_schema(ts);
>> <---- segfault here
>>
>>
>> Underlying break happens in arrows reader.h on this piece of code...
>>
>> #define GARROW_TYPE_RECORD_BATCH_READER
>> #(garrow_record_batch_reader_get_type())
>> G_DECLARE_DERIVABLE_TYPE(GArrowRecordBatchReader,
>>                           garrow_record_batch_reader,
>>                           GARROW,
>>                           RECORD_BATCH_READER,
>>                           GObject)
>>
>> It smells like its something to do with my sub classing of
>> RecordBatchReader but I don't know enough about glib.
>>
>> Thanks, Matt
>>
>>

Mime
View raw message