Страниц: [1]
  Печать  
Автор Тема: shared function ??  (Прочитано 4167 раз)
vladimir_sun
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« : Июля 26, 2004, 02:33:11 pm »

В общем, есть несколько процессов и они друг другу должны предоставить некую функцию с помощью которой другой процесс может что-нибудь сказать тому, который спит в данный момент. Несколько туманно объяснил... В QNX4 это делалось с помощью функций qnx_segment_[arm|get|free].
А как это сделать в шестерке?
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #1 : Июля 26, 2004, 03:25:50 pm »

shared libraries Huh?
Записан

vladimir_sun
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #2 : Июля 26, 2004, 03:57:52 pm »

Нет. Предположим, что у нас есть спящий процесс c pid'ом plid и работающий процесс slid. В shared memory лежит массив структур с именем proc описывающий запущенные процессы. Тогда slid делает примерно следующее:

cs = qnx_segment_get( proc[plid].pid, proc[plid].cs, 0 );
ds = qnx_segment_get( proc[plid].pid, proc[plid].ds, 0 );
offset = MK_FP( cs, proc[plid].offset );
disable();
fstart( ds, cb, slid );

Где fstart у нас имеет следующий вид:

int fstart( short ds, int (far *), int lid );
#pragma aux fstart =
   "push ds"
   "push es"
   "push gs"
   "mov gs, cx"
   "mov es, ax"
   "mov ds, ax"
   "mov eax, edx"
   "call pword ptr gs:[ebx]"
   "pop gs"
   "pop es"
   "pop ds"
   parm [ax] [cx ebx] [edx] value [eax];

Таким образом запущенная функция должна отработав оставить все данные в адресном пространстве спящего процесса.
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #3 : Июля 26, 2004, 05:25:36 pm »

Хм. Грязная работа я бы сказал. очень операционно-зависимое решение.

А не проще ли запустить два потока в спящем, один из которых дрыхнет, а второй ждет сообщения ? И красивое архитектурно и даже платформо-независимое решение.
Записан

avs
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #4 : Июля 26, 2004, 06:08:57 pm »

lestat
Грязная работа я бы сказал. очень операционно-зависимое решение.


Тут, скорее, не грязная, а несколько "устаревшая" и "немодная", о чем в документации прямо так и написано:
---------------------------------------------------------
Although this function is available in both the 16-bit and 32-bit libraries, the qnx_segment_... family of calls is primarily intended for the 16-bit segmented version of QNX. To allocate and share memory in the 32-bit version you should look at using the POSIX shm_open() and mmap() functions.
---------------------------------------------------------
Хотя на вкус и цвет ...
Записан
vladimir_sun
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #5 : Июля 27, 2004, 02:57:26 pm »

lestat
Хм. Грязная работа я бы сказал. очень операционно-зависимое решение.


Вполне вероятно.

lestat
А не проще ли запустить два потока в спящем, один из которых дрыхнет, а второй ждет сообщения ? И красивое архитектурно и даже платформо-независимое решение.


Просто мне нужно перенести программу из QNX4 в QNX6. В четверке это решение было вполне корректным, а в QNX6  я, возможно вообще запущу 1 многопоточный процесс и адресное пространство будет единым. Я еще в поиске.
Вопрос был в том "Как этот фокус повторить в QNX6 и чем это грозит?".
Записан
MikeP
Участник
*
Offline Offline

Сообщений: 6


Просмотр профиля WWW
« Ответ #6 : Июля 27, 2004, 03:29:22 pm »

системы крайне разные и придумывать трюк, как обойти различия не стоит - лучше сделать именно по 6-ку. Вернее будет - и проблем меньше встретите.
Записан
Страниц: [1]
  Печать  
 
Перейти в: