arrow-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sutou Kouhei <...@clear-code.com>
Subject Re: c/c++ interop
Date Wed, 17 Feb 2021 01:29:48 GMT
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