From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50815) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VHx4G-0005as-KL for qemu-devel@nongnu.org; Fri, 06 Sep 2013 10:31:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VHx4B-0006Zy-0p for qemu-devel@nongnu.org; Fri, 06 Sep 2013 10:31:24 -0400 Received: from wanbli.kerneis.info ([2001:41d0:8:38ad::1]:58850) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VHx4A-0006Zs-Oa for qemu-devel@nongnu.org; Fri, 06 Sep 2013 10:31:18 -0400 From: Gabriel Kerneis Date: Fri, 6 Sep 2013 15:30:39 +0100 Message-Id: <1378477839-7353-2-git-send-email-gabriel@kerneis.info> In-Reply-To: <1378477839-7353-1-git-send-email-gabriel@kerneis.info> References: <1378477839-7353-1-git-send-email-gabriel@kerneis.info> Subject: [Qemu-devel] [RFC] Introduce blocking_fn annotation List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, stefanha@gmail.com, pbonzini@redhat.com, Gabriel Kerneis , charlie@ctshepherd.com A blocking function is a function that must not be called in coroutine context, for example because it might block for a long amount of time. This annotation should be used to mark normal functions that have a coroutine_fn counterpart, to make sure that the former is not used instead of the later in coroutine context. Signed-off-by: Gabriel Kerneis --- include/block/coroutine.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/include/block/coroutine.h b/include/block/coroutine.h index 4232569..a92d14f 100644 --- a/include/block/coroutine.h +++ b/include/block/coroutine.h @@ -46,6 +46,29 @@ */ #define coroutine_fn +/** + * Mark a function that executes in blocking context + * + * Functions that execute in blocking context cannot be called directly from + * coroutine functions. In the future it would be nice to enable compiler or + * static checker support for catching such errors. This annotation might make + * it possible and in the meantime it serves as documentation. + * + * Annotating a function as "blocking" is stronger than having a mere + * (unannotated) normal function. It means that it might block the main + * loop for a significant amount of time, and therefore must not be + * called in coroutine context. In general, its hints that an + * alternative coroutine function performing the same taks is available + * for use in coroutine context. + * + * For example: + * + * static void blocking_fn foo(void) { + * .... + * } + */ +#define blocking_fn + typedef struct Coroutine Coroutine; /** -- 1.7.10.4