Changeset 7445 for trunk/tools


Ignore:
Timestamp:
Nov 24, 2001, 7:05:31 AM (24 years ago)
Author:
bird
Message:

Tried to make some kind of handshake to fix dead mutexes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/CmdQd/CmdQd.c

    r7444 r7445  
    1 /* $Id: CmdQd.c,v 1.9 2001-11-24 02:21:39 bird Exp $
     1/* $Id: CmdQd.c,v 1.10 2001-11-24 06:05:31 bird Exp $
    22 *
    33 * Command Queue Daemon / Client.
     
    182182        msgShowFailedJobs = 13,
    183183        msgShowFailedJobsResponse = 14,
     184        msgSharedMemOwnerDied = 0xfd,
     185        msgClientOwnerDied = 0xfe,
    184186        msgDying = 0xff
    185187    } enmMsgType;
     
    513515    rc = DosExecPgm(NULL, 0, EXEC_BACKGROUND, &szArg[0], NULL, &Res, &szArg[0]);
    514516    if (rc)
    515         Error("Fatal error: Failed to start daemon. rc=%d\n");
     517        Error("Fatal error: Failed to start daemon. rc=%d\n", rc);
    516518    return rc;
    517519}
     
    12011203
    12021204
     1205            case msgClientOwnerDied:
     1206            {
     1207                DosCloseMutexSem(pShrMem->hmtxClient);
     1208                rc = DosCreateMutexSem(NULL, &pShrMem->hmtxClient, DC_SEM_SHARED, FALSE);
     1209                if (rc)
     1210                    Error("Failed to restore dead client semaphore\n");
     1211                pShrMem->enmMsgType = msgUnknown;
     1212                rc = shrmemSendDaemon(TRUE);
     1213                break;
     1214            }
     1215
     1216
     1217            case msgSharedMemOwnerDied:
     1218            {
     1219                DosCloseMutexSem(pShrMem->hmtx);
     1220                rc = DosCreateMutexSem(NULL, &pShrMem->hmtx, DC_SEM_SHARED, TRUE);
     1221                if (rc)
     1222                    Error("Failed to restore dead shared mem semaphore\n");
     1223                pShrMem->enmMsgType = msgUnknown;
     1224                rc = shrmemSendDaemon(TRUE);
     1225                break;
     1226            }
    12031227
    12041228
    12051229            default:
    1206                 Error("Internal error: Invalid message id %d\n", pShrMem->enmMsgType);
     1230                Error("Internal error: Invalid message id %d\n", pShrMem->enmMsgType, rc);
    12071231                pShrMem->enmMsgType = msgUnknown;
    12081232                rc = shrmemSendDaemon(TRUE);
     
    18711895    if (cch > sizeof(pShrMem->u1.Submit.szCommand))
    18721896    {
    1873         Error("Fatal error: Command too long.\n");
     1897        Error("Fatal error: Command too long.\n", rc);
    18741898        shrmemFree();
    18751899        return -1;
     
    22712295{
    22722296    int     rc;
    2273 
     2297    ULONG   ulIgnore;
     2298
     2299    /*
     2300     * Get memory.
     2301     */
    22742302    rc = DosGetNamedSharedMem((PPVOID)(PVOID)&pShrMem,
    22752303                              SHARED_MEM_NAME,
     
    22772305    if (rc)
    22782306    {
    2279         Error("Fatal error: Failed to open shared memory. rc=%d\n");
     2307        Error("Fatal error: Failed to open shared memory. rc=%d\n", rc);
    22802308        return rc;
    22812309    }
    22822310
     2311
     2312    /*
     2313     * Open semaphores.
     2314     */
    22832315    rc = DosOpenEventSem(NULL, &pShrMem->hevClient);
    22842316    if (rc)
    22852317    {
    2286         Error("Fatal error: Failed to open client event semaphore. rc=%d\n");
     2318        Error("Fatal error: Failed to open client event semaphore. rc=%d\n", rc);
    22872319        DosFreeMem(pShrMem);
    22882320        return rc;
     
    22922324    if (rc)
    22932325    {
    2294         Error("Fatal error: Failed to open daemon event semaphore. rc=%d\n");
     2326        Error("Fatal error: Failed to open daemon event semaphore. rc=%d\n", rc);
    22952327        DosCloseEventSem(pShrMem->hevClient);
    22962328        DosFreeMem(pShrMem);
     
    23012333    if (rc)
    23022334    {
    2303         Error("Fatal error: Failed to open mutex semaphore. rc=%d\n");
    2304         DosCloseEventSem(pShrMem->hevClient);
    2305         DosCloseEventSem(pShrMem->hevDaemon);
    2306         DosFreeMem(pShrMem);
    2307         return rc;
     2335        /* try correct client died situation */
     2336        if (rc == ERROR_SEM_OWNER_DIED)
     2337        {
     2338            pShrMem->enmMsgType = msgSharedMemOwnerDied;
     2339            DosResetEventSem(pShrMem->hevClient, &ulIgnore);
     2340            DosPostEventSem(pShrMem->hevDaemon);
     2341            if (DosWaitEventSem(pShrMem->hevClient, 2000))
     2342            {
     2343                Error("Fatal error: Failed to open mutex semaphore. (owner dead) rc=%d\n", rc);
     2344                shrmemFree();
     2345                return rc;
     2346            }
     2347            rc = DosOpenMutexSem(NULL, &pShrMem->hmtx);
     2348        }
     2349
     2350        if (rc)
     2351        {
     2352            Error("Fatal error: Failed to open mutex semaphore. rc=%d\n", rc);
     2353            DosCloseEventSem(pShrMem->hevClient);
     2354            DosCloseEventSem(pShrMem->hevDaemon);
     2355            DosFreeMem(pShrMem);
     2356            return rc;
     2357        }
    23082358    }
    23092359
     
    23112361    if (rc)
    23122362    {
    2313         Error("Fatal error: Failed to open client mutex semaphore. rc=%d\n");
    2314         DosCloseEventSem(pShrMem->hevClient);
    2315         DosCloseEventSem(pShrMem->hevDaemon);
    2316         DosCloseMutexSem(pShrMem->hmtx);
    2317         DosFreeMem(pShrMem);
    2318         return rc;
    2319     }
    2320 
    2321     rc = DosRequestMutexSem(pShrMem->hmtxClient, SEM_INDEFINITE_WAIT);
    2322     if (rc)
    2323     {
    2324         Error("Fatal error: Failed to open take ownership of client mutex semaphore. rc=%d\n");
    2325         shrmemFree();
    2326         return rc;
    2327     }
    2328 
    2329     rc = DosRequestMutexSem(pShrMem->hmtx, SEM_INDEFINITE_WAIT);
    2330     if (rc)
    2331     {
    2332         Error("Fatal error: Failed to open take ownership of mutex semaphore. rc=%d\n");
    2333         shrmemFree();
    2334         return rc;
     2363        /* try correct client died situation */
     2364        if (rc == ERROR_SEM_OWNER_DIED)
     2365        {
     2366            pShrMem->enmMsgType = msgClientOwnerDied;
     2367            DosResetEventSem(pShrMem->hevClient, &ulIgnore);
     2368            DosPostEventSem(pShrMem->hevDaemon);
     2369            if (DosWaitEventSem(pShrMem->hevClient, 2000))
     2370            {
     2371                Error("Fatal error: Failed to open client mutex semaphore. (owner dead) rc=%d\n", rc);
     2372                shrmemFree();
     2373                return rc;
     2374            }
     2375            rc = DosOpenMutexSem(NULL, &pShrMem->hmtxClient);
     2376        }
     2377
     2378        if (rc)
     2379        {
     2380            Error("Fatal error: Failed to open client mutex semaphore. rc=%d\n", rc);
     2381            DosCloseEventSem(pShrMem->hevClient);
     2382            DosCloseEventSem(pShrMem->hevDaemon);
     2383            DosCloseMutexSem(pShrMem->hmtx);
     2384            DosFreeMem(pShrMem);
     2385            return rc;
     2386        }
    23352387    }
    23362388
    23372389
    23382390    /*
    2339      * Install signal handlers.
     2391     * Before we request semaphores we need to have signal handlers installed.
    23402392     */
    23412393    signal(SIGSEGV, signalhandlerClient);
     
    23442396    signal(SIGINT,  signalhandlerClient);
    23452397    signal(SIGBREAK,signalhandlerClient);
     2398
     2399
     2400    /*
     2401     * Request the necessary semaphores to be able to talk to the daemon.
     2402     */
     2403    rc = DosRequestMutexSem(pShrMem->hmtxClient, SEM_INDEFINITE_WAIT);
     2404    if (rc)
     2405    {
     2406        /* try correct client died situation */
     2407        if (rc == ERROR_SEM_OWNER_DIED)
     2408        {
     2409            pShrMem->enmMsgType = msgClientOwnerDied;
     2410            DosResetEventSem(pShrMem->hevClient, &ulIgnore);
     2411            DosPostEventSem(pShrMem->hevDaemon);
     2412            if (DosWaitEventSem(pShrMem->hevClient, 2000))
     2413            {
     2414                Error("Fatal error: Failed to take ownership of client mutex semaphore. (owner dead) rc=%d\n", rc);
     2415                shrmemFree();
     2416                return rc;
     2417            }
     2418            rc = DosRequestMutexSem(pShrMem->hmtxClient, SEM_INDEFINITE_WAIT);
     2419        }
     2420
     2421        if (rc)
     2422        {
     2423            Error("Fatal error: Failed to take ownership of client mutex semaphore. rc=%d\n", rc);
     2424            shrmemFree();
     2425            return rc;
     2426        }
     2427    }
     2428
     2429    rc = DosRequestMutexSem(pShrMem->hmtx, SEM_INDEFINITE_WAIT);
     2430    if (rc)
     2431    {
     2432        /* try correct client died situation */
     2433        if (rc == ERROR_SEM_OWNER_DIED)
     2434        {
     2435            pShrMem->enmMsgType = msgSharedMemOwnerDied;
     2436            DosResetEventSem(pShrMem->hevClient, &ulIgnore);
     2437            DosPostEventSem(pShrMem->hevDaemon);
     2438            if (DosWaitEventSem(pShrMem->hevClient, 2000))
     2439            {
     2440                Error("Fatal error: Failed to take ownership of mutex mutex semaphore. (owner dead) rc=%d\n", rc);
     2441                shrmemFree();
     2442                return rc;
     2443            }
     2444            rc = DosRequestMutexSem(pShrMem->hmtx, SEM_INDEFINITE_WAIT);
     2445        }
     2446
     2447        if (rc)
     2448        {
     2449            Error("Fatal error: Failed to take ownership of mutex semaphore. rc=%d\n", rc);
     2450            shrmemFree();
     2451            return rc;
     2452        }
     2453    }
     2454
    23462455
    23472456    return rc;
Note: See TracChangeset for help on using the changeset viewer.