|
|
  |
new и scmRTOS, Можно ли прерывать операцию new?! |
|
|
|
Dec 8 2008, 10:11
|
Участник

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

|
Делаю проект с использованием оси и с динамическим созданием объектов. Причем, создание и удаление объектов производяться в различных по приоритету (разумеется) процессах. Программа работает несколько минут, потом виснет (включая айдл процесс, тикает только системник). Наибольший адрес объекта, созданного когда-либо в рантайме, вылетает далеко за пределы кучи. Все сводится к тому, что проблема в создании обекта в одном из процессов. Так вот вопрос, можно ли безопасно создавать объекты в разных процессах, не опасаясь, что процедура "new" будет прервана высшестоящим процессом, в котором тоже запустится new, c вытекающим сбоем в работе динамической памяти??
|
|
|
|
|
Dec 8 2008, 12:22
|
Участник

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

|
Цитата(Сергей Борщ @ Dec 8 2008, 14:15)  Нет, нельзя. Переопределите глобальные operator new() и operator delete() - обрамите в нем malloc() и free() глобальным TMutex. Опс, а как там выделить эти malloc и free? Если не сложно, можно небольшой примерчик?
|
|
|
|
|
Dec 8 2008, 13:09
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Dec 8 2008, 13:27
|
Участник

Группа: Участник
Сообщений: 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 вызовы конструктора и деструктора объекта?!
|
|
|
|
|
Dec 8 2008, 17:26
|
Участник

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

|
Цитата(IgorKossak @ Dec 8 2008, 19:14)  Конструктор вызывается при создании обьекта Lock, а деструктор - при уничтожении этого обьекта, когда он покидает область видимости, в первом случае это блок, во втором - вся функция. Нет-нет, я про тот объект, который создается собственно оператором new. Ведь new и malloc- это не совсем идентичные функции,- new выделяет память под объект заданного типа и запускает конструктор этого объекта- и вот, память выделили, а конструктор?! Чего то недопонимаю? Цитата extern bool FreeMemory(); // Ищет память: сборка мусора. А сборка мусора -это , по-сути, дефрагментация кучи, что б дырок не было?
|
|
|
|
|
Dec 8 2008, 22:23
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Dec 9 2008, 12:59
|
Участник

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

|
Спасибо за обстоятельные ответы. Заработало :-) Может, включить эти измененные new и delete в дистрибутив оси?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|