From: Vladimir Lettiev <crux@gorodmasterov.com> To: ALT Devel discussion list <devel@altlinux.ru> Subject: Re: [devel] Re: I: Sisyphus-20050929 unmets: +2 (93/40) Date: Mon, 03 Oct 2005 23:03:28 +0400 Message-ID: <43418080.50905@gorodmasterov.com> (raw) In-Reply-To: <20051003154033.GA29064@basalt.office.altlinux.org> [-- Attachment #1: Type: text/plain, Size: 1547 bytes --] Dmitry V. Levin пишет: > On Sun, Oct 02, 2005 at 02:19:07PM +0400, Vladimir Lettiev wrote: >>Я сделал патч для IPC::ShareLite. >>Как мне показалось проблема в том, что данный модуль сначала делает >>shmdt() и лишь после пытается метить сегмент флагом IPC_RMID. Попробовал >>поменять порядок и вроде как заработало. >>Если кто-то может его прокомментировать, welcome. Как оказалось проблема была в том, что происходила попытка подключения к сегменту, который был удалён. > Патч без контекста не очевиден, но то, что вы предлагаете сделать, логично > и, насколько я понимаю, должно работать на всех ядрах. Сложность в том, что IPC::ShareLite позволяет создавать сегмент, который может как удаляться, после отработки программы, так и нет (зачем это надо, не знаю). Видимо придётся фиксить также все программы, которые захотят использовать последнюю возможность этого модуля. Патч я переделал. Теперь модуль проходит как собственные тесты, так и тесты других приложений, которые его используют (например, perl-Cache-Cache). Возможно ошибки всё же всплывут, но по крайне мере удалось исключить зависание, за счёт использования вместо semop() вызова semtimedop(), который позволяет задать время таймаута. Смысл патча^Wхака в том, чтобы не детачится от сегмента, если число подключений меньше двух. И проверять перед унижтожением сегмента, что он уже не был уничтожен раньше, чтобы не нервировать shmat(). p.s. Исправленый пакет с этим патчем я уже залил в incoming. -- С уважением, Владимир Леттиев aka crux <crux@gorodmasterov.com> [-- Attachment #2: perl-IPC-ShareLite-fixOwl.patch --] [-- Type: text/x-patch, Size: 2304 bytes --] --- sharelite.c~~ 2000-04-14 14:24:00 +0400 +++ sharelite.c 2005-10-03 22:35:59 +0400 @@ -22,12 +22,12 @@ /* --- DEFINE MACROS FOR SEMAPHORE OPERATIONS --- */ -#define GET_EX_LOCK(A) semop((A), &ex_lock[0], 3) -#define GET_EX_LOCK_NB(A) semop((A), &ex_lock_nb[0], 3) -#define RM_EX_LOCK(A) semop((A), &ex_unlock[0], 1) -#define GET_SH_LOCK(A) semop((A), &sh_lock[0], 2) -#define GET_SH_LOCK_NB(A) semop((A), &sh_lock_nb[0], 2) -#define RM_SH_LOCK(A) semop((A), &sh_unlock[0], 1) +#define GET_EX_LOCK(A) semtimedop((A), &ex_lock[0], 3, &timeout[0]) +#define GET_EX_LOCK_NB(A) semtimedop((A), &ex_lock_nb[0], 3, &timeout[0]) +#define RM_EX_LOCK(A) semtimedop((A), &ex_unlock[0], 1, &timeout[0]) +#define GET_SH_LOCK(A) semtimedop((A), &sh_lock[0], 2, &timeout[0]) +#define GET_SH_LOCK_NB(A) semtimedop((A), &sh_lock_nb[0], 2, &timeout[0]) +#define RM_SH_LOCK(A) semtimedop((A), &sh_unlock[0], 1, &timeout[0]) /* --- DEFINE STRUCTURES FOR MANIPULATING SEMAPHORES --- */ @@ -61,6 +61,10 @@ { 1, -1, (SEM_UNDO | IPC_NOWAIT) } /* remove shared read lock */ }; +static struct timespec timeout[1] = { + { 3, 0 } /* 3 sec timeout */ +}; + /* USER INITIATED LOCK */ /* returns 0 on success -- requested operation performed * @@ -192,10 +196,14 @@ int _detach_segments(Node *node) { Node *next_node; + struct shmid_ds shmarg; while(node != NULL) { next_node = node->next; - if (shmdt((char *) node->shmaddr) < 0) return -1; + if (shmctl(node->shmid,IPC_STAT, &shmarg) < 0) return -1; + if (shmarg.shm_nattch > 1) { + if (shmdt((char *) node->shmaddr) < 0) return -1; + } free(node); node = next_node; } @@ -205,12 +213,14 @@ int _remove_segments(int shmid) { int next_shmid; Header *shmaddr; + struct shmid_ds shmarg; while(shmid >= 0) { + if (shmctl(shmid, IPC_STAT, &shmarg) < 0 && errno == EIDRM) return 0; if ((shmaddr = (Header *) shmat(shmid, (char *) 0, 0)) == (Header *) -1) return -1; next_shmid = shmaddr->next_shmid; - if (shmdt((char *) shmaddr) < 0) return -1; if (shmctl(shmid, IPC_RMID, (struct shmid_ds *) 0) < 0) return -1; + if (shmdt((char *) shmaddr) < 0) return -1; shmid = next_shmid; }
prev parent reply other threads:[~2005-10-03 19:03 UTC|newest] Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top 2005-09-29 19:08 [devel] " Alexey M. Tourbin 2005-09-29 20:28 ` Vladimir Lettiev 2005-09-30 15:35 ` Alexey Gladkov 2005-09-30 23:15 ` Vladimir Lettiev 2005-10-01 3:16 ` [devel] " Alexey Tourbin 2005-10-01 7:16 ` Vladimir Lettiev 2005-10-01 7:28 ` Alexey Tourbin 2005-10-01 16:01 ` Dmitry V. Levin 2005-10-01 20:22 ` [devel] [JT] 2.6-ow? Michael Shigorin 2005-10-02 10:19 ` [devel] Re: I: Sisyphus-20050929 unmets: +2 (93/40) Vladimir Lettiev 2005-10-03 15:40 ` Dmitry V. Levin 2005-10-03 19:03 ` Vladimir Lettiev [this message]
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=43418080.50905@gorodmasterov.com \ --to=crux@gorodmasterov.com \ --cc=devel@altlinux.ru \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git