} defs;
ushort def_vals[_WAPI_SHARED_SEM_COUNT];
int i;
+ int retries = 0;
for (i = 0; i < _WAPI_SHARED_SEM_COUNT; i++) {
def_vals[i] = 1;
defs.array = def_vals;
again:
+ retries++;
oldkey = _wapi_shared_layout->sem_key;
if (oldkey == 0) {
*/
while ((_wapi_sem_id = semget (key, _WAPI_SHARED_SEM_COUNT,
IPC_CREAT | IPC_EXCL | 0600)) == -1) {
- if (errno != EEXIST) {
- g_warning ("%s: semget error: %s key 0x%x - trying again", __func__, g_strerror (errno), key);
+ if (errno == ENOMEM) {
+ g_critical ("%s: semget error: %s", __func__,
+ g_strerror (errno));
+ } else if (errno == ENOSPC) {
+ g_critical ("%s: semget error: %s. Try deleting some semaphores with ipcs and ipcrm", __func__, g_strerror (errno));
+ } else if (errno != EEXIST) {
+ if (retries > 3)
+ g_warning ("%s: semget error: %s key 0x%x - trying again", __func__,
+ g_strerror (errno), key);
}
key++;
*/
if (semctl (_wapi_sem_id, 0, SETALL, defs) == -1) {
- g_warning ("%s: semctl init error: %s - trying again", __func__, g_strerror (errno));
+ if (retries > 3)
+ g_warning ("%s: semctl init error: %s - trying again", __func__, g_strerror (errno));
/* Something went horribly wrong, so try
* getting a new set from scratch
_wapi_sem_id = semget (oldkey, _WAPI_SHARED_SEM_COUNT, 0600);
if (_wapi_sem_id == -1) {
- g_warning ("%s: semget error opening old key 0x%x (%s) - trying again", __func__, oldkey, g_strerror (errno));
+ if (retries > 3)
+ g_warning ("%s: semget error opening old key 0x%x (%s) - trying again",
+ __func__, oldkey,g_strerror (errno));
/* Someone must have deleted the semaphore set, so
* blow away the bad key and try again