> man operating_systems
Центр информации по операционным системам :: Форумы :: Операционные системы :: Другие ОС
 
<< Предыдущая тема | Следующая тема >>
Реально ли сделать простую ОСь своими руками?
Переход на страницу  1 2 3 ... 5 [6] 7 ... 11 12 13
Модераторы: Roman I Khimov, Wanderer, Dron
Автор Добавил
Wanderer
Среда 15.11.2006 21:10

ID пользователя #2
Зарегистрирован: Вторник 29.06.2004 20:13
Местонахождение: Беларусь, Гомель
Сообщений: 76
Извращенцы.

Доказывая идиоту, что он идиот, ты сам становишься идиотом.
Наверх
Сайт
Freeman
Среда 15.11.2006 21:36
ID пользователя #3
Зарегистрирован: Четверг 01.07.2004 14:57
Сообщений: 207
Roman I Khimov написал(а) ...
Однако, если что-то где-то почему-то у него не получится, все занятое он должен освободить и сказать Linux'у "звыняй, но не получится у меня штуковиной сей порулить". 90 с лишним процентов применения goto в Linux именно на это, пожалуй, и уходит.

Задача легко решается привлечением аспекта "транзакции". Но использование goto для реализации транзакций - это м-м-м... как бы помягче?
Наверх
Roman I Khimov
Среда 15.11.2006 21:45

ID пользователя #1
Зарегистрирован: Воскресенье 27.06.2004 12:37
Местонахождение: Санкт-Петербург
Сообщений: 601
Freeman написал(а) ...
Задача легко решается привлечением аспекта "транзакции". Но использование goto для реализации транзакций - это м-м-м... как бы помягче?

Эм-м-м... Ну это C.


Греби и улыбайся!
Наверх
Сайт
Dron
Среда 15.11.2006 23:31


ID пользователя #13
Зарегистрирован: Понедельник 05.07.2004 11:16
Местонахождение: Москва
Сообщений: 651
Я бы вообще goto убил бы... всмысле совсем.

Тут недавно сталкивался...
есть библиотека с объектом Error.

Кроме того юзается AtlRx.h

ДЫк конфликт имен, в AtlRx - Error - Это метка, которая не привязана к неймспейсу! А если еще попытаться одновременно заюзать msxml, то появляется еще один конфликт, который правда легко завуалировать.

Роман, то, что в линуксе все написано так - это просто так у них пошло видимо изначально. У нас вот тоже недавно ушел программист один, он писал ну очень размашисто.. функция на 500 строк с изобилием goto - это норма... а так же изобилие условий, не смотря на C++ глобальный контроль работы через HRESULT, и еще несколько грехов...

Мне бедному это теперь придется почти все переписывать

В том же линуксе...
Ничего не мешает анализировать все параметры скопом...


alloc1()
alloc2()
alloc3()

if (thre allocs success) {

    сделать что-то
    return 0;
}

free1()
free2()
free3()


Ну это я условно...
НИчего не мешает при выделении либо выделять, либо возвращать специальное значение (типа NULL, но мы же говорим не только про malloc


не, лучше не так...



alloc1()
alloc2()
alloc3()
if (sombody failed) {
   free1()
   free2()
   free3()
  return failed;
}

// А здесь дальше еще большая портянка с кодом за которую тоже убил бы. :)





А при освобождении инвалидные значения просто игнорировать. и все...

Я могу предложить наверное еще парочку вариантов выхода из ситуации, да только всеравно линукс такой, какой есть. это не проблема линукса, это просто воспитание наверное такое.
[ Редактирование среда 15.11.2006 23:35 ]

Одну из двух вечных российских проблем можно, в принципе, решить с помощью асфальтоукладчиков и катков. А вот с дорогами, конечно, будет труднее...

Андрей Валяев
Наверх
Сайт
Freeman
Четверг 16.11.2006 00:25
ID пользователя #3
Зарегистрирован: Четверг 01.07.2004 14:57
Сообщений: 207
Dron написал(а) ...
Я бы вообще goto убил бы... всмысле совсем.

Ошибся форумом.
Наверх
alman
Четверг 16.11.2006 01:56

ID пользователя #753
Зарегистрирован: Суббота 28.10.2006 01:21
Местонахождение: планета Земля
Сообщений: 95
Dron написал(а) ...
Ужос! можно конечно и так писать, но лучше убить себя ап стену.

Ага. А где-то залочилась критическая секция и не разлочилась, а выскочила по return.

Это уже старо - каждая функция должна иметь только одну точку выхода, тогда проблем с освобождением ресурсов не будет.

Наверх
Сайт
alman
Четверг 16.11.2006 02:12

ID пользователя #753
Зарегистрирован: Суббота 28.10.2006 01:21
Местонахождение: планета Земля
Сообщений: 95
int f()
{

int result = -1;

void * ptr1 = NULL;
void * ptr2 = NULL;
void * ptr3 = NULL;

pthread_mutex_lock( &mutex );

do {

ptr1 = malloc(PTR1_SIZE);
if( ! ptr1 ) { result = ENOMEM; break; }

result = do_something1( ptr1 );
if( result ) break;

ptr2 = malloc(PTR2_SIZE);
if( ! ptr2 ) { result = ENOMEM; break; }


result = do_something2( ptr1, ptr2);
if( result ) break;

ptr3 = malloc(PTR3_SIZE);
if( ! ptr3 ) { result = ENOMEM; break; }


result = do_something3( ptr2, ptr3 );
/* if( result ) break; */ // We dont need this check since it is a last sentence within a fake loop

} while(false);

if( ptr1 ) free(ptr1)
if( ptr2 ) free(ptr2)
if( ptr3 ) free(ptr3)

pthread_mutex_unlock( &mutex );

return result;
}

Вот пример, где есть баланс между размером кода и устойчивостью к ошибкам программиста, который забывает освобождать ресурсы.

Многоэтажных if'ов нет? нет.
Критическая секцая освобождается? да.

И ещё не известно что хуже, забыть освободить память или разброкировать критическую секцию. В первом случае просто утечка памяти, с которой программы могут жить годами, в втором случае полная блокировка ресурса и завис всех потоков в программе.

Хотя, второе, наверное, лучше - легче найти и пофиксить.
<span class='smallblacktext'>[ Редактирование четверг 16.11.2006 02:57 ]</span>
Наверх
Сайт
captain cobalt
Четверг 16.11.2006 08:54

ID пользователя #12
Зарегистрирован: Воскресенье 04.07.2004 21:44
Местонахождение: /ru/perm
Сообщений: 144
Dron написал(а) ...
Я бы вообще goto убил бы... всмысле совсем.
Тогда твой выбор Оберон.
Там нет GOTO.
Но есть LOOP, EXIT и RETURN.
alman написал(а) ...
Ага. А где-то залочилась критическая секция и не разлочилась, а выскочила по return.
В Active Oberon критические секции являются частью языка.
И перед нужными RETURN освобождение критической секции добавляется компилятором автоматически!

bluebottle.ethz.ch - Bluebottle. Швейцария. Сделано с умом.
Наверх
Сайт
captain cobalt
Четверг 16.11.2006 08:55

ID пользователя #12
Зарегистрирован: Воскресенье 04.07.2004 21:44
Местонахождение: /ru/perm
Сообщений: 144
И ещё.

Если есть сборщик мусора, то для корректного управления ресурсами, ориентированными на память, не нужны ни исключения, ни IF-ы. Вообще ничего делать не надо. Как только по ошибке указатель на объект выйдет из области видимости, так о нём позаботится сборщик мусора.

bluebottle.ethz.ch - Bluebottle. Швейцария. Сделано с умом.
Наверх
Сайт
grizlyk
Четверг 16.11.2006 09:02
ID пользователя #757
Зарегистрирован: Понедельник 06.11.2006 22:42
Сообщений: 72
alman написал(а) ...
на С/С++ без исклчений и многоэтажных if можно писать так:
конструкция do{...}while(0); многих раздражает, ее можно легко заменить на for(;;){ ... break;} Конечно, любая из них в виде
написал(а) ...
for(;;)
{
...
if(){... break;}
...
if(){... break;}
...
break;
}
много лучше чем
написал(а) ...
...
if(){...}
else{
... if(){...}
esle{
...
}
}
Но вот обе конструкции с трудом могут заменить исключения, т.к. при создание одного объекта может быть бессмысленным без создания другого и к тому же, зачем создавать объекты, которые сразу придется удалять?
написал(а) ...
Tobj1 obj1(new char[1024]);
Tobj2 obj2(obj1);
А в следующем примере
alman написал(а) ...
Вот пример, где есть баланс между размером кода и устойчивостью к ошибкам программиста, который забывает освобождать ресурсы.
вместо
alman написал(а) ...
void * ptr1 = NULL;
void * ptr2 = NULL;
if( ptr1 ) free(ptr1)
if( ptr2 ) free(ptr2)
много лучше сделать класс, делающий из указателя на размещенный в куче объект полноценную локальную переменную.

В плохо структурированной программе, на скорую руку можно использовать следующий код, который я когда то использовал:
написал(а) ...
#ifndef HOLDER_H
#define HOLDER_H

#pragma interface "holder.h"
/*
Класс для хранения объектов.
class Tobj_holder
*/

/*
Класс Tobj_holder для хранения объектов.
Удобен для представления динамически создаваемого
(не на стеке, а с new) объекта Tobj как
локальной переменной Tobj.
На стеке функции создается Tobj_holder.
Удаление хранимого в Tobj_holder объекта Tobj
происходит при выходе из функции. Можно выходить из
функции в любом месте.

Объект Tobj в Tobj_holder-е ведет себя
как обычный автоматический объект Tobj.

Объект Tobj должен быть создан new Tobj.

Объект Tobj_holder может быть скопирован,
если Tobj имеет конструктор копии.
*/

namespace Pclasses{
template <class Tobj>class Tobj_holder
{
Tobj *ptr;

public:
//получить содержимое
//не для удаления снаружи
Tobj* get_obj()const throw(){return ptr;}
Tobj* operator() ()const throw(){return get_obj();}

//установить содержимое полученное от new Tobj
Tobj* set_obj(Tobj *const obj)throw()
{
if(ptr!=obj)
{
delete ptr;
ptr=obj;
}
return ptr;
}
Tobj* operator= (Tobj *const obj)throw(){return set_obj(obj);}

public:

Tobj_holder()throw():ptr(0){}
Tobj_holder(Tobj *const obj)throw():ptr(obj){}

Tobj_holder(const Tobj_holder& obj)throw():ptr(0){ptr= new Tobj(*obj.ptr);}
Tobj_holder& operator= (const Tobj_holder& obj)throw()
{
if( &obj != this )
{
delete ptr;
ptr=new Tobj(*obj.ptr);
}
return *this;
}

~Tobj_holder()throw()
{
delete ptr;
ptr=0;
}
};}

#endif
Я думаю,
alman написал(а) ...
во втором случае полная блокировка ресурса и завис всех потоков в программе.
что главная защита от блокировки ресурса - не надо пытаться распаралелить все что на глаза попадет.

Любая активно используемая синхронизация говорит о том, что вы зря параллелите здесь. Особенно, если процессор реально один.

Хотя, я может быть, отстал от жизни и не знаю преимуществ такого подхода?
Наверх
Переход на страницу  1 2 3 ... 5 [6] 7 ... 11 12 13  

Перейти:     Наверх

Транслировать сообщения этой темы: rss 0.92 Транслировать сообщения этой темы: rss 2.0 Транслировать сообщения этой темы: RDF
Powered by e107 Forum System

© OSRC.info, 2004-2010.
Авторские права на любые материалы, авторы которых явно указаны, принадлежат их авторам. По вопросам публикации таких материалов обращайтесь к авторам.
Авторские права на любые другие материалы принадлежат OSRC.info.
Сайт является помещением библиотеки. Копирование, сохранение на жестком диске или иной способ сохранения произведений осуществляются пользователями на свой риск.
При использовании материалов сайта ссылка на OSRC.info обязательна.