Shmem named semaphore issue on linux

Ion, The named semaphore on linux seems to never increment the initial count when creating. Looking into the posix implementation a sem_init is never called if create is given and it just returns true. bool operator()(const shared_memory::segment_info_t * info, bool created) const { mp_sem = reinterpret_cast<sem_t *>(info->get_user_ptr()); switch(m_create){ case open_only: mp_sem = reinterpret_cast<sem_t *>(info->get_user_ptr()); break; case open_or_create: if(created){ if(sem_init(mp_sem, 1, m_initialCount) == 0){ return true; } else{ mp_sem = 0; return false; } } break; case create_only: return true; break; default: return false; break; } return true; } I think this method should be bool operator()(const shared_memory::segment_info_t * info, bool created) const { mp_sem = reinterpret_cast<sem_t *>(info->get_user_ptr()); switch(m_create){ case open_only: mp_sem = reinterpret_cast<sem_t *>(info->get_user_ptr()); break; case open_or_create: if(created){ if(sem_init(mp_sem, 1, m_initialCount) == 0){ return true; } else{ mp_sem = 0; return false; } } break; case create_only: if(sem_init(mp_sem, 1, m_initialCount) == 0){ return true; } else{ mp_sem = 0; return false; } break; default: return false; break; } return true; } Paul Ryan SAIC - Tactical Systems

The named semaphore on linux seems to never increment the initial count when creating. Looking into the posix implementation a sem_init is never called if create is given and it just returns true.
[snip] You are right. Your proposed code is the correct answer. I've updated boost-sandbox CVS with your proposed changes. Thanks and regards, Ion
participants (2)
-
Ion Gaztañaga
-
Ryan, Paul L.