LINUX.ORG.RU

так вроде семафор имеет целое значение,
т.е. ты можешь задать для начала значение -1,

так что узнать факт неопущенного семафора проблематично

anonymous
()
Ответ на: комментарий от cvv

что значит отказывается?

он прямо так и сказал: "Что хочешь cvv делай, но я не буду делать down".

anonymous
()
Ответ на: комментарий от anonymous

>что значит отказывается?

завис в состоянии "D" (ожидание i/o)

cvv ★★★★★
() автор топика

> почему up на неопущенном семафоре нигде не регистрируется как ошибка?

потому, что это не ошибка, хотя используется редко.

semaphore - он, на самом деле, counting semaphore, т.е. после
двух up() (на locked sem) можно сделать два неблокирующих down().

> да, но почему в таком случае он отказывается после up делать down?

пример кода

idle ★★★★★
()
Ответ на: комментарий от idle

>пример кода

typedef struct{
    int fd;
    send_buf_id_t sendbuf_id;
    struct rw_semaphore mutex;
}fd_set_item_t;

typedef fd_set_item_t fd_set_arr_t[__FD_SETSIZE];

static unsigned fd_set_locks_debug=1;
#define debug fd_set_locks_debug 

void fd_set_arr_wlock_item  (fd_set_arr_t fd_set_arr, unsigned item){
    if(debug)printk(__func__":%ld:try write lock item %u in fd_set_arr=%p \n",(long)current->pid, item, fd_set_arr);
    down_write(&fd_set_arr[item].mutex);
    if(debug)printk(__func__":%ld:item %u in fd_set_arr=%p write locked.  fd_set_arr[i].fd=%d fd_set_arr[i].sendbuf_id=%llu\n",
            (long)current->pid, item, fd_set_arr, fd_set_arr[item].fd, fd_set_arr[item].sendbuf_id);
}

void fd_set_arr_wunlock_item(fd_set_arr_t fd_set_arr, unsigned item){
    if(debug)printk(__func__":%ld:try write unlock item %u in fd_set_arr=%p. fd_set_arr[i].fd=%d fd_set_arr[i].sendbuf_id=%llu\n",
            (long)current->pid, item, fd_set_arr, fd_set_arr[item].fd, fd_set_arr[item].sendbuf_id);
    up_write(&fd_set_arr[item].mutex);
    if(debug)printk(__func__":%ld:item %u in fd_set_arr=%p write unlocked\n",(long)current->pid, item, fd_set_arr);
}

static fd_set_item_t*fd_set_arr_new(void){
    unsigned i;
    fd_set_item_t*fd_set_arr;
    if(!(fd_set_arr   =   kmalloc(sizeof(fd_set_arr_t), GFP_USER))){
        printk(__func__":%ld:Out of memory\n",(long)current->pid);//ругаемся  
        //@todo:хорошо подумать что делаем в случае отсутствия свободной памяти 
        return NULL;
    }
    for (i=0; i<__FD_SETSIZE; i++){
        fd_set_arr[i].sendbuf_id=0LL;
        init_rwsem(&fd_set_arr[i].mutex);
    }
    return fd_set_arr;
}

{
    fd_set_item_t*fd_set_arr=fd_set_arr_new();

    fd_set_arr_wunlock_item(fd_set_arr,0);

    fd_set_arr_wlock_item(fd_set_arr,0);//ЗДЕСЬ ВИСИМ
}

лог от старта процесса до зависания процесса:

Jan 13 15:16:48 chernookiy kernel: fd_set_arr_wunlock_item:1059:try write unlock item 0 in fd_set_arr=cff00000. fd_set_arr[i].fd=4 f
d_set_arr[i].sendbuf_id=1
Jan 13 15:16:48 chernookiy kernel: fd_set_arr_wunlock_item:1059:item 0 in fd_set_arr=cff00000 write unlocked
Jan 13 15:16:48 chernookiy kernel: fd_set_arr_wlock_item:1059:try write lock item 0 in fd_set_arr=cff00000

после ликвидирования ошибки в виде лишнего поднятия семафора всё заработало

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

cvv, это НЕ пример кода для такой простой проблемы.
пример кода был бы таким:

struct rw_semaphore rw;

void test(void)
{
        init_rwsem(&rw);
        up_write(&rw);
        down_write(&rw); // <--------- виснет здесь.
}

уже не говоря о том что ваш код (с моей точки зрения)
трудно назвать сколько-нибудь читаемым, он не показывает
как были инициализированы эти структуры данных.

а виснет потому, что и должно виснуть.

потому, что это не семафор. это RW семафор, и это
разные вещи. а вы спрашивали:

> почему up на неопущенном семафоре нигде не регистрируется как ошибка?
> да, но почему в таком случае он отказывается после up делать down?

чем всех ввели в заблуждение.

idle ★★★★★
()
Ответ на: комментарий от idle

>cvv, это НЕ пример кода для такой простой проблемы.
>пример кода был бы таким:

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

>он не показывает как были инициализированы эти структуры данных.

не понял что вы имели ввиду, разве вот этот цикл не инициализирует структуры?:

for (i=0; i<__FD_SETSIZE; i++){
        fd_set_arr[i].sendbuf_id=0LL;
        init_rwsem(&fd_set_arr[i].mutex);
}

>а виснет потому, что и должно виснуть.
>потому, что это не семафор. это RW семафор, и это разные вещи. 

спасибо

>а вы спрашивали:

>> почему up на неопущенном семафоре нигде не регистрируется как ошибка?
>> да, но почему в таком случае он отказывается после up делать down?

>чем всех ввели в заблуждение.

извиняюсь, кода небыло под рукой

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

> > он не показывает как были инициализированы эти структуры данных.
>
> не понял что вы имели ввиду, разве вот этот цикл не инициализирует структуры?:

да, прошу прощения, не заметил.

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.