Changeset 3666


Ignore:
Timestamp:
Feb 21, 2025, 3:31:23 PM (5 weeks ago)
Author:
bird
Message:

kmk: More debugging code for the mysterious 'kmk: write error: stdout' problem...

Location:
trunk/src/kmk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/kmk/Makefile.kmk

    r3641 r3666  
    243243kmk_DEFS.win       := CONFIG_WITH_OUTPUT_IN_MEMORY
    244244kmk_DEFS.win.x86   := CONFIG_NEW_WIN32_CTRL_EVENT
    245 kmk_DEFS.win.amd64 := CONFIG_NEW_WIN32_CTRL_EVENT
     245kmk_DEFS.win.amd64 := CONFIG_NEW_WIN32_CTRL_EVENT DEBUG_STDOUT_CLOSE_ISSUE
    246246kmk_DEFS.debug     := CONFIG_WITH_MAKE_STATS
    247247ifdef CONFIG_WITH_MAKE_STATS
  • TabularUnified trunk/src/kmk/output.c

    r3664 r3666  
    6060#endif
    6161
    62 #if defined(KMK) && defined(KBUILD_OS_WINDOWS) && 1
    63 # define DEBUG_STDOUT_CLOSE_ISSUE
     62#ifdef DEBUG_STDOUT_CLOSE_ISSUE
    6463/* fflush wrapper w/ error checking + reporting for stdout.
    6564   This is to debug the mysterious 'kmk: write error: stdout' errors. */
     
    6867static void my_stdout_error (const char *pszOperation, const char *pszMessage)
    6968{
     69# ifdef KBUILD_OS_WINDOWS
    7070  DWORD const     dwErr   = GetLastError ();
     71# endif
    7172  int const       iErrNo  = errno;
    72   int const       fdFile  = fileno(stdout);
     73  int const       fdFile  = fileno (stdout);
     74# ifdef KBUILD_OS_WINDOWS
    7375  HANDLE    const hNative = (HANDLE)_get_osfhandle (_fileno (stdout));
    7476  DWORD const     dwType  = GetFileType (hNative);
    75   fprintf (stderr, "kmk: %s: %s! (lasterr=%u errno=%d fileno=%d native=%p type=%#x)\n",
    76            pszOperation, pszMessage, dwErr, iErrNo, fdFile, hNative, dwType);
     77  fprintf (stderr, "kmk[%u]: %s: %s! (lasterr=%u errno=%d fileno=%d native=%p type=%#x)\n",
     78           makelevel, pszOperation, pszMessage, dwErr, iErrNo, fdFile, hNative, dwType);
     79# else
     80  fprintf (stderr, "kmk[%u]: %s: %s! (lasterr=%u errno=%d fileno=%d)\n",
     81           makelevel, pszOperation, pszMessage, dwErr, iErrNo, fdFile);
     82# endif
    7783}
    7884
     
    107113# define fflush(a_pFile) my_fflush(a_pFile)
    108114
    109 #endif
     115/* Preserves errno and win32 last error. */
     116void my_check_stdout (const char *pszWhere)
     117{
     118  if (!g_fStdOutError)
     119    {
     120# ifdef KBUILD_OS_WINDOWS
     121      DWORD const dwErrSaved  = GetLastError();
     122# endif
     123      int const   iErrNoSaved = errno;
     124
     125      if (ferror (stdout))
     126        {
     127          my_stdout_error (pszWhere, "error pending!");
     128          g_fStdOutError = 1;
     129        }
     130
     131      errno = iErrNoSaved;
     132# ifdef KBUILD_OS_WINDOWS
     133      SetLastError(dwErrSaved);
     134# endif
     135    }
     136}
     137
     138#endif /* DEBUG_STDOUT_CLOSE_ISSUE */
    110139
    111140
  • TabularUnified trunk/src/kmk/output.h

    r3479 r3666  
    104104#endif
    105105
     106#ifdef DEBUG_STDOUT_CLOSE_ISSUE
     107void my_check_stdout (const char *pszWhere);
     108#endif
     109
    106110#endif /* INLCUDED_MAKE_OUTPUT_H */
    107111
  • TabularUnified trunk/src/kmk/w32/winchildren.c

    r3627 r3666  
    12871287    extern int          process_priority;
    12881288#endif
     1289#ifdef DEBUG_STDOUT_CLOSE_ISSUE
     1290    my_check_stdout("mkWinChildcareWorkerCreateProcess/entry");
     1291#endif
    12891292
    12901293    /*
     
    14501453    CloseHandle(ProcInfo.hThread);
    14511454    kmk_cache_exec_image_w(pwszImageName);
     1455#ifdef DEBUG_STDOUT_CLOSE_ISSUE
     1456    my_check_stdout("mkWinChildcareWorkerCreateProcess/tail");
     1457#endif
    14521458    return 0;
    14531459}
     
    35893595{
    35903596    PWINCHILD pChild;
     3597#ifdef DEBUG_STDOUT_CLOSE_ISSUE
     3598    my_check_stdout ("MkWinChildWait/entry");
     3599#endif
    35913600
    35923601    *pPid         = 0;
     
    36013610    {
    36023611        DWORD dwStatus = WaitForSingleObject(g_hEvtWaitChildren, INFINITE);
     3612#ifdef DEBUG_STDOUT_CLOSE_ISSUE
     3613        my_check_stdout ("MkWinChildWait/wakeup");
     3614#endif
    36033615        if (dwStatus == WAIT_FAILED)
    36043616            return (int)GetLastError();
     
    36413653    dir_cache_invalid_after_job();
    36423654#endif
     3655#ifdef DEBUG_STDOUT_CLOSE_ISSUE
     3656    my_check_stdout ("MkWinChildWait/tail");
     3657#endif
    36433658    return 0;
    36443659}
     
    36783693    WCHAR                  *pwszPathIgnored;
    36793694    int                     rc;
     3695#ifdef DEBUG_STDOUT_CLOSE_ISSUE
     3696    my_check_stdout("MkWinChildReExecMake/entry");
     3697#endif
    36803698
    36813699    /*
     
    37443762
    37453763        CloseHandle(ProcInfo.hProcess);
     3764#ifdef DEBUG_STDOUT_CLOSE_ISSUE
     3765        my_check_stdout("MkWinChildReExecMake/exit");
     3766#endif
    37463767        for (;;)
    37473768            exit(dwExitCode);
Note: See TracChangeset for help on using the changeset viewer.