LINUX.ORG.RU

Сообщения subuser

 

Разделяемая память и ее защита.

Форум — Development

Добрый вечер, форумчане!

Имеется вопрос, есть в проекте (операционка QNX4.25) несколько разделяемых объектов памяти, для взаимодействия между процессами. Есть один писатель в каждую из них и несколько читателей, я написал несколько функций оберток вида:

void XXXX_ShmemLock()
{
	assert( g_Shmem );
	sem_wait( &g_Shmem->lock );
}

void XXXX_ShmemUnlock()
{
	assert( g_Shmem );
	sem_post( &g_Shmem->lock );
}

void XXXX_ShmemCopy( void *destination, const void *source, const size_t num )
{
	XXXX_ShmemLock();
	_disable();
	memcpy( destination, source, num );
	_enable();
	XXXX_ShmemUnlock();
}

Дальнейшие операции более высокого уровня, выполняются путем вызова функций-оберток, как пример приложу:

void XXXX_ReadADC( const ADCChannel_t channel, double *voltage )
{
	assert( channel < ADC_ChannelsNum );
//	*voltage = g_Shmem->Vin[channel];
	XXXX_ShmemCopy( (void *)voltage, (const void *)&g_Shmem->Vin[channel], sizeof(g_Shmem->Vin[channel]) );
}

void XXXX_WriteADC( const ADCChannel_t channel, const double voltage )
{
	assert( channel < ADC_ChannelsNum );
//	g_Shmem->Vin[channel] = voltage;
	XXXX_ShmemCopy( (void *)&g_Shmem->Vin[channel], (const void *)&voltage, sizeof(voltage) );
}
P.S. Насколько рационален такой подход?

Так вот, как видно в функции XXXX_ShmemCopy, копирование данных в область и из нее, производится вызовом memcpy, обернутым в семафор и дополнительным отключением прерываний на момент копирования, чтобы обеспечить атомарность операции. Есть ли вообще смысл в такой перестраховке на однопроцессорной системе? Минус в использовании _disable()/_enable() при больших объемах копирования (которых скорее всего не будет), на момент выполнения операции, стопорится работа всей системы, или если вызовов XXXX_ShmemCopy будет много (а их скорее всего будет много), то рискуем то и делать что бесконечно выключать/включать прерывания. Так же есть ли необходимость оборачивания простых операций вида «Область->переменная = что-то записать», понятное дело не делая справа от «=» сложных операций, будет ли такая операция выполнена атомарно?

 , , , ,

subuser
()

Вопрос по awesome

Форум — Desktop

ArchLinux: Установил xorg, настроил, установил awesome из репозитория. Добавил в .xinitrc exec awesome. Запускаю startx. Получаю:

http://s39.radikal.ru/i086/1009/85/5ec89c6899fe.jpg

Т.е. как таковой темы оформления нет, и все не очень то красиво. Так и должно быть при первой установке? или я что-то упустил. Просто первый раз столкнулся с awesome и языком lua. Прежде чем начать ковырять конфиги, хотелось бы удостоверится в том что все правильно установлено. Еще не очень понятно что же такое Wicked, Naughty, Vicious. Буржуйскую инфу пытался читать, понял только что Viciois уже включает в себя все Wicked, и что Wicked устаревший. Проясните пожалуйста. Буду очень благодарен.

subuser
()

Commit failed: svn+trac

Форум — Admin

Добрый день. Около 3-х дней потратил время на исследование работы связки subversion+trac. Установил связку на ArchLinux по их Wiki и + офф Wiki. Т.е. присуствует установка:

apache mod_python mysql mysql-python setuptools subversion genshi trac

Сначало устанавливал субверсию, проверил на работоспособность (коммиты и тп). Работала, приступил к установке trac и все что для него нужно, тоже работает, видит коммиты сделанные до правки конфига. В конфиге httpd-ssl.conf добавлено следующее:

<virtualhost *:80> DocumentRoot «/home/trac» ServerName 192.168.1.2 <location / > SetHandler mod_python PythonInterpreter main_interpreter PythonHandler trac.web.modpython_frontend PythonOption TracEnv /home/trac/123 PythonOption TracUriRoot / </location> <location / > AuthType Basic AuthName «Trac Server» AuthUserFile /home/svn/.svn-auth-file Require valid-user </location> </virtualhost>

<location /svn> DAV svn SVNParentPath /home/svn/repos AuthzSVNAccessFile /home/svn/.svn-policy-file AuthName «SVN repos» AuthType Basic AuthUserFile /home/svn/svn-auth-file Satisfy Any Require valid-user <code></code></location>

Если, закоментарить все что за virtualhost, а в частности эти строки: PythonOption TracEnv /home/trac/123 PythonOption TracUriRoot / то commit проходит, но как только их дописывают Tortoise пишет:

Commit failed (details follow): PROPFIND of '/svn/123/!svn/wrk/28ab1b53-3e2b-2241-b29f-14f04ccbc483/dfgdfgdfgdgd.rtf': Could not read chunk size: connection was closed by server (http://192.168.1.2) PROPFIND of '/svn/123/dfgdfgdfgdgd.rtf': Could not read chunk size: connection was closed by server (http://192.168.1.2)

Уже пухнет голова, это финальный штрих в настройке связки... помогите пожалуйста разобраться. Заранее спс.

subuser
()

RSS подписка на новые темы