{"id":1078,"date":"2011-08-24T12:30:50","date_gmt":"2011-08-24T10:30:50","guid":{"rendered":"http:\/\/blog.benny-baumann.de\/?p=1078"},"modified":"2011-08-24T12:37:47","modified_gmt":"2011-08-24T10:37:47","slug":"schleifchen-erwartet","status":"publish","type":"post","link":"http:\/\/blog.benny-baumann.de\/?p=1078","title":{"rendered":"Schleifchen erwartet"},"content":{"rendered":"<p>Unter der Kategorie Kuriosit\u00e4ten kann man glaube folgenden GCC-Bug abhandeln, der bei mir mit folgendem Source auftrat:<\/p>\n<pre lang=\"c\" highlight=\"6\">\r\n        \/\/ Run the job we've taken\r\n        if(cleanup_func) {\r\n            pthread_cleanup_push(cleanup_func, cleanup_arg);\r\n        }\r\n\r\n        job_func(job_arg);\r\n\r\n        if(cleanup_func) {\r\n            pthread_cleanup_pop(1);\r\n        }\r\n<\/pre>\n<p>Wobei job_func ein normaler Callback-Typ der Form<\/p>\n<pre lang=\"c\">typedef void (* dispatch_func_t)(void *);<\/pre>\n<p>ist, also einen Pointer entgegen nimmt und nix zur\u00fcckliefert. Nunja. Versucht man obigen Source (im Zusammenhang mit etwas mehr Source eines Thread-Pools zu compilieren, erh\u00e4lt man recht \u00fcberraschend eine Fehlermeldung vom GCC (4.6.1-4):<\/p>\n<pre>\r\ngcc -g -Wall -Werror -std=c99 -I.\/src -O9 -o .\/obj\/threadpool.o -c .\/src\/threadpool.c\r\n.\/src\/threadpool.c: In Funktion \u00bb_threadpool_dowork\u00ab:\r\n.\/src\/threadpool.c:120:9: Fehler: expected \u00bbwhile\u00ab before \u00bbjob_func\u00ab\r\n<\/pre>\n<p>Und ja: Der will da wirklich ne While-Schleife haben! Geben wir sie ihm also:<\/p>\n<pre lang=\"c\" highlight=\"6,7,9\">\r\n        \/\/ Run the job we've taken\r\n        if(cleanup_func) {\r\n            pthread_cleanup_push(cleanup_func, cleanup_arg);\r\n        }\r\n\r\n        \/\/GCC fails if I DON'T write a while loop here. Let's make it happy!\r\n        while(0);\r\n\r\n        job_func(job_arg);\r\n\r\n        if(cleanup_func) {\r\n            pthread_cleanup_pop(1);\r\n        }\r\n<\/pre>\n<p>Und der GCC ist zufrieden.<\/p>\n<p class=\"wp-flattr-button\"><a href=\"http:\/\/blog.benny-baumann.de\/?flattrss_redirect&amp;id=1078&amp;md5=edf6f3b015bbc028ea178cc4a940a4b2\" title=\"Flattr\" target=\"_blank\"><img src=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" srcset=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" alt=\"Flattr this!\"\/><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Unter der Kategorie Kuriosit\u00e4ten kann man glaube folgenden GCC-Bug abhandeln, der bei mir mit folgendem Source auftrat: \/\/ Run the job we&#8217;ve taken if(cleanup_func) { pthread_cleanup_push(cleanup_func, cleanup_arg); } job_func(job_arg); if(cleanup_func) { pthread_cleanup_pop(1); } Wobei job_func ein normaler Callback-Typ der Form typedef void (* dispatch_func_t)(void *); ist, also einen Pointer entgegen nimmt und nix zur\u00fcckliefert. Nunja. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[29],"tags":[14,98,347,13],"class_list":["post-1078","post","type-post","status-publish","format-standard","hentry","category-software","tag-bugs","tag-developement","tag-fun","tag-patch"],"_links":{"self":[{"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1078","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1078"}],"version-history":[{"count":2,"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1078\/revisions"}],"predecessor-version":[{"id":1080,"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1078\/revisions\/1080"}],"wp:attachment":[{"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1078"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1078"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1078"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}