[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
global variables and oct files
From: |
Xavier Delacour |
Subject: |
global variables and oct files |
Date: |
Sun, 5 Jul 2009 13:35:18 -0700 |
I am having some difficulty creating an oct-file that defines a custom
type (octave_base_value derivative) and installs an instance of it as
a global variable. Working with revision 9252:a1d20052517a
(release-3-2-0 tag), here is a small self-contained example:
------ BEGIN global_test.cc
// g++ -g -c -Wno-long-double global_test.cc && g++ -bundle -undefined
suppress -flat_namespace -g -Wno-long-double global_test.o -o
global_test.oct
#include <octave/oct.h>
#include <octave/parse.h>
class test_type:public octave_base_value {
public:
test_type() {
}
octave_base_value *clone() const {
return new test_type(*this);
}
octave_base_value *empty_clone() const {
return new test_type();
}
bool is_defined() const {
return true;
}
void print(std::ostream &os, bool pr_as_read_syntax = false) const {
}
private:
DECLARE_OCTAVE_ALLOCATOR;
DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA;
};
DEFINE_OCTAVE_ALLOCATOR(test_type);
DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(test_type, "test_type", "test_type");
DEFUN_DLD (global_test,args,nargout,"global_test") {
test_type::register_type();
set_global_value("test_global_var",new test_type);
mlock();
return octave_value_list();
}
------ END global_test.cc
------ BEGIN global_test_runme.m
global_test
who global
# who output contains test_global_var
clear -g
who global
# bug? who output still contains test_global_var
------ END global_test_runme.m
Running octave -q global_test_runme.m results in segfault at exit:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x008dc0ec
0x011cf705 in ~octave_value [inlined] () at ov.h:295
295 delete rep;
(gdb) bt
#0 0x011cf705 in ~octave_value [inlined] () at ov.h:295
#1 0x011cf705 in ~octave_value [inlined] () at ov.h:296
#2 0x011cf705 in ~pair [inlined] () at ov.h:69
#3 0x011cf705 in __gnu_cxx::new_allocator<std::pair<std::string
const, octave_value> >::destroy () at ov.h:107
#4 0x011cf705 in ~pair [inlined] () at ov.h:389
#5 0x011cf705 in ~pair [inlined] () at ov.h:389
#6 0x011cf705 in std::_Rb_tree<std::string, std::pair<std::string
const, octave_value>, std::_Select1st<std::pair<std::string const,
octave_value> >, std::less<std::string>,
std::allocator<std::pair<std::string const, octave_value> >
>::_M_erase (this=0x1e26958, __x=0x6029c70) at defun.cc:69
#7 0x01481055 in __tcf_7 () at defun.cc:69
#8 0x93d2bdbc in __cxa_finalize ()
#9 0x93d2bcb0 in exit ()
#10 0x01411a1b in octave_main (argc=3, argv=0xbffff3b8, embedded=0) at
defun.cc:69
#11 0x00001ffe in main ()
#12 0x00001fb2 in start ()
So in other words, octave has unloaded my .oct file before calling my
instance's destructor. Also as noted in global_test_runme.m comment,
clear -g does not actually remove my variable.
I'm not sure if this is a bug or incorrect usage of the API. Any
suggestions would be much appreciated.
For purposes of fixing swig-related crashes, it would be preferable to
make the above example work. However, removing all globals (and
returning octave_value pointing to created object) works fine and
produces no crashes (ie, assign global_test result to local variable;
apparently that gets cleared properly before unloading oct-files).
Unfortunately that would have the side effect of forcing all
swig-defined symbols to appear under a struct/namespace object (eg,
ns.ann_func() rather than just ann_func()).
Thanks,
Xavier
- global variables and oct files,
Xavier Delacour <=