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

 
 
> 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
 
Start new topic
Ответов
Сергей Борщ
сообщение 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



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

 


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


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