Проблема владения
От: AndryBlack Россия  
Дата: 18.07.12 22:24
Оценка:
На очередной итерации переписывания собственного биндинга C++/Lua возникла проблема владения наследуемых обьектов.
template <class T> class shared_ptr;
class LuaReference;
class wrapper {
   LuaReference m_self;
   template <...> call(name,...) { call_lua_fucntion( m_self, name, ... );
};
class Base {
  virtual void foo() {}
};
typedef shared_ptr<Base> BasePtr;
class Base_wrapper : public Base, public wrapper {
  virtual void foo() { call("foo"); }
};
struct lua_storage {
   BasePtr ptr;
};

На Lua стороне соответсвенно инстанс наследника — табличка, содержащая среди всего в семе поле "__native" с юзердата хранящим lua_storage
Суть проблемы: контроль времени жизни Lua объекта, сейчас получается перекрестные ссылки
возможные состояния:
1) обьект только на Lua стороне — управление стандартными средствами lua GC. Base_wrapper не должен держать обьект
2) обьект удерживается в С коде, сам он держит Lua часть от сборки через LuaReference m_self
Как красиво решить данную проблему не правя реализацию shared_ptr ?


ситуация в которой обьект может быть уничтожен

переход между состояниями может произойти банальным weak_ref.lock(). на C стороне (клиенский код) ничего незнает о lua составляющей. ручное управление владением ala adopt policy из luabind даром ненужно
сейчас видится решение контролировать количество сильных ссылок на Base_wrapper.
увеличивается >1 — локаем LuaReference, уменьшается до 1 — убиваем LuaRef.
но без хака в shared_ptr я не вижу возможности это сделать.
Re: Проблема владения
От: johny5 Новая Зеландия
Дата: 19.07.12 03:29
Оценка:
Здравствуйте, AndryBlack, Вы писали:

AB>но без хака в shared_ptr я не вижу возможности это сделать.


Тут 2 очевидных viable подхода:
1. Делать цельный Lua<->C++ count reference (если boost::shared_ptr не подходит можно посмотреть в сторону intrusive_ptr — там счётчик вытащен наружу)
2. Делать strong_ptr <-> weak_ptr концепт

Мы остановились на втором. Объект владеется С++ стороной, Lua держит ключик, по которому происходит поиск и доступ к объекту на С++ стороне. Соответственно если объект удалён на С++ стороне, Lua получит нормальный null-object. Если Lua хочет удалить объект сама — используем спец. API.
Re[2]: Проблема владения
От: AndryBlack Россия  
Дата: 19.07.12 08:24
Оценка:
Здравствуйте, johny5, Вы писали:

J>Здравствуйте, AndryBlack, Вы писали:


AB>>но без хака в shared_ptr я не вижу возможности это сделать.


J>Тут 2 очевидных viable подхода:

J> 1. Делать цельный Lua<->C++ count reference (если boost::shared_ptr не подходит можно посмотреть в сторону intrusive_ptr — там счётчик вытащен наружу)
J> 2. Делать strong_ptr <-> weak_ptr концепт

J>Мы остановились на втором. Объект владеется С++ стороной, Lua держит ключик, по которому происходит поиск и доступ к объекту на С++ стороне. Соответственно если объект удалён на С++ стороне, Lua получит нормальный null-object. Если Lua хочет удалить объект сама — используем спец. API.


Можно подробней? Наследование в Lua от С++ классов есть?
Re[3]: Проблема владения
От: johny5 Новая Зеландия
Дата: 19.07.12 10:08
Оценка:
Здравствуйте, AndryBlack, Вы писали:

J>> 1. Делать цельный Lua<->C++ count reference (если boost::shared_ptr не подходит можно посмотреть в сторону intrusive_ptr — там счётчик вытащен наружу)


AB>Можно подробней? Наследование в Lua от С++ классов есть?


Нету.
Вам будет лучше перейти на 1й вариант — intrusive_ptr. Отнаследованный LUA класс увеличивает счётчик на базовый класс, и т.д...
Re[4]: Проблема владения
От: AndryBlack Россия  
Дата: 19.07.12 11:59
Оценка:
Здравствуйте, johny5, Вы писали:

J>Здравствуйте, AndryBlack, Вы писали:


J>>> 1. Делать цельный Lua<->C++ count reference (если boost::shared_ptr не подходит можно посмотреть в сторону intrusive_ptr — там счётчик вытащен наружу)


AB>>Можно подробней? Наследование в Lua от С++ классов есть?


J>Нету.

J>Вам будет лучше перейти на 1й вариант — intrusive_ptr. Отнаследованный LUA класс увеличивает счётчик на базовый класс, и т.д...

не, это не вариант сейчас клиентский код вообще не знает про то что его биндят, хочется оставить shared_ptr.
описано ли в стандарте что будет если из deleter-a shared_ptr дернуть weak_ptr.lock() ?)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.