diff --git a/kernel/trunk/core/heap.inc b/kernel/trunk/core/heap.inc index c88fe8c9f2..d63d8caf70 100644 --- a/kernel/trunk/core/heap.inc +++ b/kernel/trunk/core/heap.inc @@ -1149,25 +1149,32 @@ destroy_smap: pushfd cli - push ebx - mov ebx, eax + push esi + push edi - mov eax, [eax+SMAP.base] - test eax, eax - jz @F + mov edi, eax + mov esi, [eax+SMAP.parent] + test esi, esi + jz .done - stdcall user_free, eax -@@: - mov eax, [ebx+SMAP.parent] - test eax, eax - jz @F + lock dec [esi+SMEM.refcount] + jnz .done - lock dec [eax+SMEM.refcount] -@@: - mov eax, ebx + mov ecx, [esi+SMEM.bk] + mov edx, [esi+SMEM.fd] + + mov [ecx+SMEM.fd], edx + mov [edx+SMEM.bk], ecx + + stdcall kernel_free, [esi+SMEM.base] + mov eax, esi + call free +.done: + mov eax, edi call destroy_kernel_object - pop ebx + pop edi + pop esi popfd ret @@ -1395,6 +1402,8 @@ proc shmem_close stdcall, name:dword push esi push edi + pushfd + cli mov esi, [current_slot] add esi, APP_OBJ_OFFSET @@ -1419,8 +1428,11 @@ proc shmem_close stdcall, name:dword test eax, eax jne .next + stdcall user_free, [esi+SMAP.base] + call [esi+APPOBJ.destroy] @@: + popfd pop edi pop esi .fail: diff --git a/kernel/trunk/core/memory.inc b/kernel/trunk/core/memory.inc index a993097b52..6fc829b9c1 100644 --- a/kernel/trunk/core/memory.inc +++ b/kernel/trunk/core/memory.inc @@ -1024,10 +1024,8 @@ f68call: dd f68.22 dd f68.23 - align 4 f68: - cmp eax,4 jle sys_sheduler @@ -1038,13 +1036,11 @@ f68: ja .fail jmp dword [f68call+eax*4-11*4] - .11: call init_heap mov [esp+36], eax ret .12: - stdcall user_alloc, ebx mov [esp+36], eax ret diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index 54d6ad6c08..bc584ea0cc 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -2204,11 +2204,11 @@ dword- Замечания: * Структура таблицы цветов описана в стандартном включаемом файле macros.inc под названием system_colors; например, можно писать: - sc system_colors ; объявление переменной - ... ; где-то надо вызвать - ; описываемую функцию с ecx=sc - mov ecx, [sc.work_button_text] ; читаем цвет текста - ; на кнопке в рабочей области + sc system_colors ; объявление переменной + ... ; где-то надо вызвать + ; описываемую функцию с ecx=sc + mov ecx, [sc.work_button_text] ; читаем цвет текста + ; на кнопке в рабочей области * Использование/неиспользование этих цветов - дело исключительно самой программы. Для использования нужно просто при вызове функций рисования указывать цвет, взятый из этой таблицы. @@ -3183,10 +3183,10 @@ IPC Программе доступны данные графического экрана (область памяти, которая собственно и отображает содержимое экрана) напрямую без вызовов системных функций через селектор gs: - mov eax, [gs:0] + mov eax, [gs:0] поместит в eax первый dword буфера, содержащий информацию о цвете левой верхней точки (и, возможно, цвета нескольких следующих). - mov [gs:0], eax + mov [gs:0], eax при работе в режимах VESA c LFB установит цвет левой верхней точки (и возможно, цвета нескольких следующих). @@ -3814,6 +3814,66 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * Содержимое памяти вплоть до наименьшего из старого и нового размеров сохраняется. +=========================================================================== +====== Функция 68, подфункция 22 - открыть именованую область памяти. ===== +=========================================================================== + +Параметры + * eax = 68 - номер функции + * ebx = 22 - номер подфункции + * ecx = имя области. Максимум 32 символа включая завершающий ноль + * edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS + * esi = флаги открытия и доступа + + SHM_OPEN = 0x00 + SHM_OPEN_ALWAYS = 0x04 + SHM_CREATE = 0x08 + SHM_READ = 0x00 + SHM_WRITE = 0x01 + + SHM_CREATE - создать новую область памяти. Если область с + таким именем уже существует функция вернёт код ошибки E_ACCESS + SHM_OPEN_ALWAYS - открывает существующую или создаёт новую + область памяти. + SHM_OPEN - открывает существующую область памяти. Если + область с таким именем не существует функция вернёт код + ошибки E_NOTFOUND. + + SHM_READ - доступ только на чтение. + SHM_WRITE - доступ на чтение и запись. + +Возвращаемые значения: + * eax = указатель на область памяти или ноль в случае ошибки + * edx = если новая область создаётся SHM_CREATE или SHM_OPEN_ALWAYS + ноль в случае успеха или код ошибки. + если существующая область открывается SHM_OPEN или SHM_OPEN_ALWAYS + размер области в байтах или код ошибки + +Коды ошибок: + * E_NOTFOUND = 5 + * E_ACCESS = 10 + * E_NOMEM = 30 + * E_PARAM = 33 + +Замечания: + * Если создаётся новая область то флаги доступа устанавливают + максимальные права доступа для остальных процессов. + * Родительский процесс всегда имеет доступ на запись. + + +=========================================================================== +====== Функция 68, подфункция 22 - закрыть именованую область памяти. ===== +=========================================================================== + +Параметры + * eax = 68 - номер функции + * ebx = 23 - номер подфункции + * ecx = имя области. Максимум 32 символа включая завершающий ноль + +Возвращаемое значение: + * не определено + + ====================================================================== ======================== Функция 69 - отладка. ======================= ====================================================================== @@ -3881,7 +3941,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); и при поступлении нового сообщения система будет ждать. Для синхронизации обрамляйте всю работу с буфером операциями блокировки/разблокировки - neg [bufsize] + neg [bufsize] * Данные в буфере трактуются как массив элементов переменной длины - сообщений. Формат сообщения указан в общем описании.