powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Mono: Управление unmanaged ресурсами и Garbage collection
4 сообщений из 4, страница 1 из 1
Mono: Управление unmanaged ресурсами и Garbage collection
    #39360881
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак, есть фреимворк. Писан на Перле. Решили потихоньку идти в торону шарпов, так как фирма геимдевная и шаринг логики на клиенте и на сервере - это хорошо.

Чтобы не потерять все наработки скопом было решено попробовать следующее:
На стороне Perl'а через механизм XS, подрубить mono, дать ей прожевать сборку и вызывать оттуда статические методы, отдавая на вход Perl'овые объекты, которые будут "транслироваться" через DynamicObject (он как-бы для такого и сделан).

Все шло хорошор... Счетчики ссылок на стороне Perl'а отлично считались, объект отлично удалялся и т.д., только вот беда... Луп в 100000 вызовов падает с моновским стектрейсом и SIGSEGV. Анализ показала что причина... В сборщике мусора.

Проблема:
Perl однопотоковый (кто скажет что он многопоточный, тот никогда на Perl'е не писал нормально. Тут проще нафоркаться, чем треды нагенерить. Проблема в реализации).
А вот Mono - нет. И на больших нагрузках сборщик приходит в другом потоке, что в результате приводит к одновременному увеличению и уменьшению счетчика ссылок и "досвидания".

Код обертки на Шарпах:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
using System;
using System.Dynamic;
using System.Runtime.CompilerServices;

namespace Perl {
    public class PerlObject : DynamicObject {
        [MethodImpl(MethodImplOptions.InternalCall)]
        extern static void Perl_free_sv(IntPtr sv);

        private IntPtr _sv;
        private bool _sv_freed;

        public PerlObject(IntPtr sv) {
            _sv = sv;
            _sv_freed = false;
        }


        ~PerlObject() {
            if (_sv_freed)
                return;

            Perl_free_sv(_sv);
            _sv_freed = true;
        }

    }
}



Внимание - вопрос: Можно-ли как-то указать что объект должен "убираться" в потоке создания или вообще запретить многопоточность? Ну или предложите свои варианты решения этой проблемы.
...
Рейтинг: 0 / 0
Mono: Управление unmanaged ресурсами и Garbage collection
    #39361039
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Warstone,
По крайней мере в реализации от МС, сборка мусора всегда в специальном потоке вне зависимости от нагрузки.
...
Рейтинг: 0 / 0
Mono: Управление unmanaged ресурсами и Garbage collection
    #39361093
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А действительно необходима реализация финализатора? Его наличие создает доп. нагрузку на память в общем и GC в частности - увеличение памяти для списка финализации, перевод объектов с финализаторами по всему графу ссылок в старшие поколения, итп. Тот же IDisposable не устроит?
...
Рейтинг: 0 / 0
Mono: Управление unmanaged ресурсами и Garbage collection
    #39361207
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

FULL ACK.
Ф финализаторе переводить перловский обьект в список задержанного удаления а в Dispose освобождать текуший объект и все объекты из списка.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Mono: Управление unmanaged ресурсами и Garbage collection
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]