mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-25 10:40:08 +01:00
We use clang-format for automatic formatting of our source files. Since clang-format is actively maintained software, the actual formatting depends on the used version of clang-format. That is unfortunate and painful, but really unavoidable unless clang-format would be strictly bug-compatible. So the version that we must use is from the current Fedora release, which is also tested by our gitlab-ci. Previously, we were using Fedora 34 with clang-tools-extra-12.0.1-1.fc34.x86_64. As Fedora 35 comes along, we need to update our formatting as Fedora 35 comes with version "13.0.0~rc1-1.fc35". An alternative would be to freeze on version 12, but that has different problems (like, it's cumbersome to rebuild clang 12 on Fedora 35 and it would be cumbersome for our developers which are on Fedora 35 to use a clang that they cannot easily install). The (differently painful) solution is to reformat from time to time, as we switch to a new Fedora (and thus clang) version. Usually we would expect that such a reformatting brings minor changes. But this time, the changes are huge. That is mentioned in the release notes [1] as Makes PointerAligment: Right working with AlignConsecutiveDeclarations. (Fixes https://llvm.org/PR27353) [1] https://releases.llvm.org/13.0.0/tools/clang/docs/ReleaseNotes.html#clang-format
130 lines
3.1 KiB
C
130 lines
3.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copyright (C) 2013 Red Hat, Inc.
|
|
*/
|
|
|
|
/**
|
|
* SECTION:nmt-utils
|
|
* @short_description: Miscellaneous nmtui-specific utilities
|
|
*/
|
|
|
|
#include "libnm-client-aux-extern/nm-default-client.h"
|
|
|
|
#include "nmt-utils.h"
|
|
|
|
/**
|
|
* NmtSyncOp:
|
|
*
|
|
* A helper object used when synchronously waiting for an asynchronous
|
|
* operation to complete.
|
|
*
|
|
* The caller first does:
|
|
*
|
|
* |[
|
|
* NmtSyncOp op;
|
|
*
|
|
* nmt_sync_op_init (&op);
|
|
* ]|
|
|
*
|
|
* It then passes the op as the user_data to the async operation's
|
|
* callback function, and then calls nmt_sync_op_wait_boolean() or
|
|
* nmt_sync_op_wait_pointer() to wait for the result.
|
|
*
|
|
* When the async callback is invoked, it should call
|
|
* nmt_sync_op_complete_boolean() or nmt_sync_op_complete_pointer() to
|
|
* return a result or an error to the caller.
|
|
*
|
|
* There is no free/clear function; any memory that needs to be freed
|
|
* will have been returned to the caller from
|
|
* nmt_sync_op_wait_boolean() or nmt_sync_op_wait_pointer(), so there
|
|
* is nothing left that needs to be freed.
|
|
*/
|
|
|
|
typedef struct {
|
|
gpointer result;
|
|
GError *error;
|
|
gpointer complete;
|
|
} NmtSyncOpReal;
|
|
|
|
/**
|
|
* nmt_sync_op_init:
|
|
* @op: pointer to a stack-allocated #NmtSyncOp
|
|
*
|
|
* Initializes @op before use.
|
|
*/
|
|
void
|
|
nmt_sync_op_init(NmtSyncOp *op)
|
|
{
|
|
memset(op, 0, sizeof(*op));
|
|
}
|
|
|
|
/**
|
|
* nmt_sync_op_wait_boolean:
|
|
* @op: the #NmtSyncOp
|
|
* @error: return location for a #GError
|
|
*
|
|
* This runs the main loop until @op's operation returns, and then
|
|
* returns the result or error.
|
|
*
|
|
* Returns: the result of the operation.
|
|
*/
|
|
gboolean
|
|
nmt_sync_op_wait_boolean(NmtSyncOp *op, GError **error)
|
|
{
|
|
return GPOINTER_TO_UINT(nmt_sync_op_wait_pointer(op, error));
|
|
}
|
|
|
|
/**
|
|
* nmt_sync_op_complete_boolean:
|
|
* @op: the #NmtSyncOp
|
|
* @result: the result of the operation
|
|
* @error: (allow-none): the error, or %NULL
|
|
*
|
|
* Completes @op and returns @result and/or @error to the caller.
|
|
*/
|
|
void
|
|
nmt_sync_op_complete_boolean(NmtSyncOp *op, gboolean result, GError *error)
|
|
{
|
|
nmt_sync_op_complete_pointer(op, GUINT_TO_POINTER(result), error);
|
|
}
|
|
|
|
/**
|
|
* nmt_sync_op_wait_pointer:
|
|
* @op: the #NmtSyncOp
|
|
* @error: return location for a #GError
|
|
*
|
|
* This runs the main loop until @op's operation returns, and then
|
|
* returns the result or error.
|
|
*
|
|
* Returns: the result of the operation.
|
|
*/
|
|
gpointer
|
|
nmt_sync_op_wait_pointer(NmtSyncOp *op, GError **error)
|
|
{
|
|
NmtSyncOpReal *real = (NmtSyncOpReal *) op;
|
|
|
|
while (!real->complete)
|
|
g_main_context_iteration(NULL, TRUE);
|
|
|
|
if (real->error)
|
|
g_propagate_error(error, real->error);
|
|
return real->result;
|
|
}
|
|
|
|
/**
|
|
* nmt_sync_op_complete_pointer:
|
|
* @op: the #NmtSyncOp
|
|
* @result: the result of the operation
|
|
* @error: (allow-none): the error, or %NULL
|
|
*
|
|
* Completes @op and returns @result and/or @error to the caller.
|
|
*/
|
|
void
|
|
nmt_sync_op_complete_pointer(NmtSyncOp *op, gpointer result, GError *error)
|
|
{
|
|
NmtSyncOpReal *real = (NmtSyncOpReal *) op;
|
|
|
|
real->result = result;
|
|
real->error = error ? g_error_copy(error) : NULL;
|
|
real->complete = GUINT_TO_POINTER(TRUE);
|
|
}
|