Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Merge changes from the previous two check-ins. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
300682604f7540c7bc06d928745e4553 |
User & Date: | mistachkin 2018-08-07 23:22:57.425 |
Context
2018-08-07
| ||
23:48 | Make the backoffice module tracing behave more consistently on Win32. ... (check-in: 0fe9da81 user: mistachkin tags: trunk) | |
23:22 | Merge changes from the previous two check-ins. ... (check-in: 30068260 user: mistachkin tags: trunk) | |
23:16 | Change backoffice-nodelay to default off. ... (check-in: 12c487c4 user: drh tags: trunk) | |
Changes
Changes to src/backoffice.c.
︙ | ︙ | |||
60 61 62 63 64 65 66 67 68 69 70 71 72 73 | #include "config.h" #include "backoffice.h" #include <time.h> #if defined(_WIN32) # include <windows.h> # include <stdio.h> # include <process.h> # define GETPID (int)GetCurrentProcessId #else # include <unistd.h> # include <sys/types.h> # include <signal.h> # define GETPID getpid #endif | > > > | 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include "config.h" #include "backoffice.h" #include <time.h> #if defined(_WIN32) # include <windows.h> # include <stdio.h> # include <process.h> # if defined(__MINGW32__) # include <wchar.h> # endif # define GETPID (int)GetCurrentProcessId #else # include <unistd.h> # include <sys/types.h> # include <signal.h> # define GETPID getpid #endif |
︙ | ︙ | |||
278 279 280 281 282 283 284 | */ static void backofficeSigalrmHandler(int x){ fossil_panic("backoffice timeout (%d seconds)", x); } #if defined(_WIN32) static void *threadHandle = NULL; static void __stdcall backofficeWin32NoopApcProc(ULONG_PTR pArg){} /* NO-OP */ | | > > > > > > > > > > > > > > > > > | | 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 | */ static void backofficeSigalrmHandler(int x){ fossil_panic("backoffice timeout (%d seconds)", x); } #if defined(_WIN32) static void *threadHandle = NULL; static void __stdcall backofficeWin32NoopApcProc(ULONG_PTR pArg){} /* NO-OP */ static void backofficeWin32ThreadCleanup(int bStrict){ if( threadHandle!=NULL ){ /* Queue no-op asynchronous procedure call to the sleeping * thread. This will cause it to wake up with a non-zero * return value. */ if( QueueUserAPC(backofficeWin32NoopApcProc, threadHandle, 0) ){ /* Wait for the thread to wake up and then exit. */ WaitForSingleObject(threadHandle, INFINITE); }else if(bStrict){ DWORD dwLastError = GetLastError(); fossil_errorlog( "backofficeWin32ThreadCleanup: QueueUserAPC failed, code %lu", dwLastError ); if( !TerminateThread(threadHandle, dwLastError) ){ dwLastError = GetLastError(); fossil_panic( "backofficeWin32ThreadCleanup: TerminateThread failed, code %lu", dwLastError ); } } CloseHandle(threadHandle); threadHandle = NULL; }else if(bStrict){ fossil_panic( "backofficeWin32ThreadCleanup: no timeout thread handle" ); } } static unsigned __stdcall backofficeWin32SigalrmThreadProc( void *pArg /* IN: Pointer to integer number of whole seconds. */ ){ int seconds = FOSSIL_PTR_TO_INT(pArg); if( SleepEx((DWORD)seconds * 1000, TRUE)==0 ){ backofficeSigalrmHandler(seconds); } _endthreadex(0); return 0; /* NOT REACHED */ } #endif static void backofficeTimeout(int x){ #if defined(_WIN32) backofficeWin32ThreadCleanup(0); threadHandle = (void*)_beginthreadex( 0, 0, backofficeWin32SigalrmThreadProc, FOSSIL_INT_TO_PTR(x), 0, 0 ); #else signal(SIGALRM, backofficeSigalrmHandler); alarm(x); #endif |
︙ | ︙ | |||
475 476 477 478 479 480 481 | } db_end_transaction(0); break; } } } #if defined(_WIN32) | | | | 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 | } db_end_transaction(0); break; } } } #if defined(_WIN32) backofficeWin32ThreadCleanup(1); #endif return; } /* ** This routine runs to do the backoffice processing. When adding new ** backoffice processing tasks, add them here. */ void backoffice_work(void){ /* Log the backoffice run for testing purposes. For production deployments ** the "backoffice-logfile" property should be unset and the following code ** should be a no-op. */ char *zLog = db_get("backoffice-logfile",0); if( zLog && zLog[0] ){ FILE *pLog = fossil_fopen(zLog, "a"); if( pLog ){ char *zDate = db_text(0, "SELECT datetime('now');"); fprintf(pLog, "%s (%d) backoffice running\n", zDate, GETPID()); fclose(pLog); } } /* Here is where the actual work of the backoffice happens */ email_backoffice(0); } |
︙ | ︙ | |||
539 540 541 542 543 544 545 | wchar_t *ax[5]; argv[0] = g.nameOfExe; argv[1] = "backoffice"; argv[2] = "-R"; argv[3] = backofficeDb; ax[4] = 0; for(i=0; i<=3; i++) ax[i] = fossil_utf8_to_unicode(argv[i]); | | | | | | 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 | wchar_t *ax[5]; argv[0] = g.nameOfExe; argv[1] = "backoffice"; argv[2] = "-R"; argv[3] = backofficeDb; ax[4] = 0; for(i=0; i<=3; i++) ax[i] = fossil_utf8_to_unicode(argv[i]); x = _wspawnv(_P_NOWAIT, ax[0], (const wchar_t * const *)ax); for(i=0; i<=3; i++) fossil_unicode_free(ax[i]); if( g.fAnyTrace ){ fprintf(stderr, "/***** Subprocess %d creates backoffice child %d *****/\n", GETPID(), (int)x); } if( x>=0 ) return; } #else /* unix */ { pid_t pid = fork(); if( pid>0 ){ /* This is the parent in a successful fork(). Return immediately. */ if( g.fAnyTrace ){ fprintf(stderr, "/***** Subprocess %d creates backoffice child %d *****/\n", GETPID(), (int)pid); } return; } if( pid==0 ){ /* This is the child of a successful fork(). Run backoffice. */ setsid(); db_open_repository(backofficeDb); backofficeDb = "x"; backoffice_thread(); db_close(1); if( g.fAnyTrace ){ fprintf(stderr, "/***** Backoffice Child %d exits *****/\n", GETPID()); } exit(0); } } #endif /* Fork() failed or is unavailable. Run backoffice in this process, but ** do so with the no-delay setting. |
︙ | ︙ |