реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> new и scmRTOS, Можно ли прерывать операцию new?!
Colobox
сообщение Dec 8 2008, 10:11
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Делаю проект с использованием оси и с динамическим созданием объектов.
Причем, создание и удаление объектов производяться в различных по приоритету (разумеется) процессах. Программа работает несколько минут, потом виснет (включая айдл процесс, тикает только системник). Наибольший адрес объекта, созданного когда-либо в рантайме, вылетает далеко за пределы кучи. Все сводится к тому, что проблема в создании обекта в одном из процессов. Так вот вопрос, можно ли безопасно создавать объекты в разных процессах, не опасаясь, что процедура "new" будет прервана высшестоящим процессом, в котором тоже запустится new, c вытекающим сбоем в работе динамической памяти??
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 8 2008, 11:15
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Colobox @ Dec 8 2008, 12:11) *
можно ли безопасно создавать объекты в разных процессах, не опасаясь, что процедура "new" будет прервана высшестоящим процессом,
Нет, нельзя. Переопределите глобальные operator new() и operator delete() - обрамите в нем malloc() и free() глобальным TMutex.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Colobox
сообщение Dec 8 2008, 12:22
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Цитата(Сергей Борщ @ Dec 8 2008, 14:15) *
Нет, нельзя. Переопределите глобальные operator new() и operator delete() - обрамите в нем malloc() и free() глобальным TMutex.

Опс, а как там выделить эти malloc и free? Если не сложно, можно небольшой примерчик?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 8 2008, 13:09
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Colobox @ Dec 8 2008, 14:22) *
Если не сложно, можно небольшой примерчик?
Примерно так:
Код
#include    <stdint.h>
#include    <new>
#include    <scmRTOS.h>
extern bool FreeMemory();  // Ищет память: сборка мусора. возвращает false если памяти не нашлось

class heap_mutex_t
{
public:
    heap_mutex_t() { Mutex.Lock(); }
    ~heap_mutex_t() { Mutex.Unlock(); }
private:
    static OS::TMutex Mutex;
};

OS::TMutex heap_mutex_t::Mutex;

void * operator new(size_t size)
{
    for(;;)
    {
        void * Tmp;
        {
            heap_mutex_t Lock;
            Tmp = malloc(size);
        }
        if(Tmp)
            return Tmp;
        else
            // пытаемся найти память
            if(! FreeMemory() )
                return 0;
    }
}

void * operator new (size_t size, const _STD nothrow_t& )
{
    return operator new(size);
}

void operator delete( void * pobject )
{
    heap_mutex_t Lock;
    free(pobject);
}
"настоящий" new не возвращает 0. Мне было удобнее так. Поправьте, как вам удобнее.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Colobox
сообщение Dec 8 2008, 13:27
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Цитата(Сергей Борщ @ Dec 8 2008, 16:09) *
Код
#include    <stdint.h>
#include    <new>
#include    <scmRTOS.h>

void * operator new(size_t size)
{
    for(;;)
    {
        void * Tmp;
        {
            heap_mutex_t Lock;
            Tmp = malloc(size);
        }
        if(Tmp)
            return Tmp;
        else
            // пытаемся найти память
            if(! FreeMemory() )
                return 0;
    }
}


void operator delete( void * pobject )
{
    heap_mutex_t Lock;
    free(pobject);
}

А где же в этих "новых" new и delete вызовы конструктора и деструктора объекта?!
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 8 2008, 16:14
Сообщение #6


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Colobox @ Dec 8 2008, 15:27) *
А где же в этих "новых" new и delete вызовы конструктора и деструктора объекта?!

Конструктор вызывается при создании обьекта Lock, а деструктор - при уничтожении этого обьекта, когда он покидает область видимости, в первом случае это блок, во втором - вся функция.
Go to the top of the page
 
+Quote Post
Colobox
сообщение Dec 8 2008, 17:26
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Цитата(IgorKossak @ Dec 8 2008, 19:14) *
Конструктор вызывается при создании обьекта Lock, а деструктор - при уничтожении этого обьекта, когда он покидает область видимости, в первом случае это блок, во втором - вся функция.

Нет-нет, я про тот объект, который создается собственно оператором new. Ведь new и malloc- это не совсем идентичные функции,- new выделяет память под объект заданного типа и запускает конструктор этого объекта- и вот, память выделили, а конструктор?! Чего то недопонимаю? wacko.gif
Цитата
extern bool FreeMemory(); // Ищет память: сборка мусора.

А сборка мусора -это , по-сути, дефрагментация кучи, что б дырок не было?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 8 2008, 22:23
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Colobox @ Dec 8 2008, 19:26) *
Нет-нет, я про тот объект, который создается собственно оператором new.
А запуск конструктора вставляется компилятором после вызова operator new() после проверки результата на ноль. Такие вопросы очень легко разрешаются чтением листинга.
Цитата(Colobox @ Dec 8 2008, 19:26) *
А сборка мусора -это , по-сути, дефрагментация кучи, что б дырок не было?
А это как вам угодно. У меня в системе есть буфер сообщений. Если памяти не хватает - FreeMemory() удаляет самые старые сообщения. Сообщения теряются, но система продолжает работать. При нормальной работе эта функция вызываться не должна. Можно делать сборку мусора.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Colobox
сообщение Dec 9 2008, 12:59
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Спасибо за обстоятельные ответы. Заработало :-) Может, включить эти измененные new и delete в дистрибутив оси?
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 9 2008, 14:44
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Colobox @ Dec 9 2008, 14:59) *
...Может, включить эти измененные new и delete в дистрибутив оси?

В некоторых случаях функции malloc() и free() пользователи сами переписывают под свои нужды. Универсального решения не получится. Не думаю, что стоит включать частное решение в дистрибутив, разве что только как пример конкретного решения в примерах.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 23:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01433 секунд с 7
ELECTRONIX ©2004-2016