diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2021-04-28 19:19:34 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2021-04-28 19:19:34 -0700 |
commit | 64eed5bc02c0a4e09423aa67f118a2a7c8bc69b0 (patch) | |
tree | 070c3ce47b5da9bd1789beacbf6c555bf3045762 | |
parent | 553ff18522bce3151b8290143c7966744c302804 (diff) |
threads: handle pthread_create() errors
This doesn't try to cleanup anything on the failures, basically
assuming they're always fatal and the process will exit.
Previously no pthread_create() errors were noticed at all, which
could result in some very strange failure modes.
-rw-r--r-- | src/rmd.c | 3 | ||||
-rw-r--r-- | src/rmd_threads.c | 85 | ||||
-rw-r--r-- | src/rmd_threads.h | 3 |
3 files changed, 54 insertions, 37 deletions
@@ -150,7 +150,8 @@ int main(int argc, char **argv) } //this is where the capturing happens. - rmdThreads(&pdata); + if (rmdThreads(&pdata)) + return 1; XCloseDisplay(pdata.dpy); fprintf(stderr, ".\n"); diff --git a/src/rmd_threads.c b/src/rmd_threads.c index b3b207e..bfcdf75 100644 --- a/src/rmd_threads.c +++ b/src/rmd_threads.c @@ -46,7 +46,16 @@ #include <time.h> #include <unistd.h> -void rmdThreads(ProgData *pdata) + +int rmdThread(pthread_t *thread, void *(*func)(ProgData *), ProgData *pdata) +{ + if (pthread_create(thread, NULL, (void *)func, (void *)pdata) != 0) + return 1; + + return 0; +} + +int rmdThreads(ProgData *pdata) { pthread_t image_capture_t, image_encode_t, @@ -62,46 +71,50 @@ void rmdThreads(ProgData *pdata) } /*start threads*/ - pthread_create( &image_capture_t, - NULL, - (void *)rmdGetFrames, - (void *)pdata); + if (rmdThread(&image_capture_t, rmdGetFrames, pdata)) { + fprintf(stderr, "Error creating rmdGetFrames thread!!!\n"); + return 1; + } - if (pdata->args.encOnTheFly) - pthread_create( &image_encode_t, - NULL, - (void *)rmdEncodeImageBuffers, - (void *)pdata); - else - pthread_create( &image_cache_t, - NULL, - (void *)rmdCacheImageBuffer, - (void *)pdata); + if (pdata->args.encOnTheFly) { + if (rmdThread(&image_encode_t, rmdEncodeImageBuffers, pdata)) { + fprintf(stderr, "Error creating rmdEncodeImageBuffers thread!!!\n"); + return 1; + } + } else { + if (rmdThread(&image_cache_t, rmdCacheImageBuffer, pdata)) { + fprintf(stderr, "Error creating rmdCacheImageBuffer thread!!!\n"); + return 1; + } + } if (!pdata->args.nosound) { - if (!pdata->args.use_jack) - pthread_create( &sound_capture_t, - NULL, - (void *)rmdCaptureAudio, - (void *)pdata); + if (!pdata->args.use_jack) { + if (rmdThread(&sound_capture_t, rmdCaptureAudio, pdata)) { + fprintf(stderr, "Error creating rmdCaptureAudio thread!!!\n"); + return 1; + } + } - if (pdata->args.encOnTheFly) - pthread_create( &sound_encode_t, - NULL, - (void *)rmdEncodeAudioBuffers, - (void *)pdata); - else - pthread_create( &sound_cache_t, - NULL, - (void *)rmdCacheAudioBuffer, - (void *)pdata); + if (pdata->args.encOnTheFly) { + if (rmdThread(&sound_encode_t, rmdEncodeAudioBuffers, pdata)) { + fprintf(stderr, "Error creating rmdEncodeAudioBuffers thread!!!\n"); + return 1; + } + } else { + if (rmdThread(&sound_cache_t, rmdCacheAudioBuffer, pdata)) { + fprintf(stderr, "Error creating rmdCacheAudioBuffer thread!!!\n"); + return 1; + } + } } - if (pdata->args.encOnTheFly) - pthread_create( &flush_to_ogg_t, - NULL, - (void *)rmdFlushToOgg, - (void *)pdata); + if (pdata->args.encOnTheFly) { + if (rmdThread(&flush_to_ogg_t, rmdFlushToOgg, pdata)) { + fprintf(stderr, "Error creating rmdFlushToOgg thread!!!\n"); + return 1; + } + } rmdRegisterCallbacks(pdata); fprintf(stderr,"Capturing!\n"); @@ -158,6 +171,8 @@ void rmdThreads(ProgData *pdata) fprintf(stderr,".."); fprintf(stderr,"."); + + return 0; } void rmdThreadsSetName(const char *name) diff --git a/src/rmd_threads.h b/src/rmd_threads.h index 6ca2dbd..d80985f 100644 --- a/src/rmd_threads.h +++ b/src/rmd_threads.h @@ -30,6 +30,7 @@ #include "rmd_types.h" +int rmdThread(pthread_t *thread, void *(*func)(ProgData *), ProgData *pdata); /** * Launch and wait capture threads. * Also creates and waits the encoding threads when @@ -37,7 +38,7 @@ * * \param pdata ProgData struct containing all program data */ -void rmdThreads(ProgData *pdata); +int rmdThreads(ProgData *pdata); void rmdThreadsSetName(const char *name); |