2005-09-27 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / io-layer / shared.c
index 9f06ad89a25af734468a626860f48d6861299061..022d4728ab178c6a74c612468f08864ed893084d 100644 (file)
@@ -246,6 +246,7 @@ void _wapi_shm_semaphores_init ()
        } 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;
@@ -253,6 +254,7 @@ void _wapi_shm_semaphores_init ()
        defs.array = def_vals;
        
 again:
+       retries++;
        oldkey = _wapi_shared_layout->sem_key;
 
        if (oldkey == 0) {
@@ -267,8 +269,15 @@ again:
                 */
                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++;
@@ -282,7 +291,8 @@ again:
                 */
                
                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
@@ -314,7 +324,9 @@ again:
 
        _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