base-modem: synchronize initialize/enable/disable/sync operations
Each of these now holds an exclusive lock, so all these operations are synchronized. This logic can be tested by queing different enable/disable operations one after the other, e.g.: mmcli -m a -d & --> Disable 1 sleep 0.2 mmcli -m a -e & --> Enable 1 sleep 0.2 mmcli -m a -e & --> Enable 2 sleep 0.2 mmcli -m a -d & --> Disable 2 sleep 0.2 mmcli -m a -e & --> Enable 3 sleep 0.2 mmcli -m a -d & --> Disable 3 This previous sequence produces MM logs as follows: <dbg> [1726566352.936025] [modem0] [operation 9] default - disable: scheduled --> Disable 1 requested <dbg> [1726566352.936399] [modem0] [operation 9] default - disable: lock acquired --> Disable 1 started <dbg> [1726566353.136445] [modem0] [operation 10] default - enable: scheduled --> Enable 1 requested <dbg> [1726566353.202980] [modem0] [operation 9] default - disable: lock released --> Disable 1 finished <dbg> [1726566353.203526] [modem0] [operation 10] default - enable: lock acquired --> Enable 1 started <dbg> [1726566353.320057] [modem0] [operation 11] default - enable: scheduled --> Enable 2 requested <dbg> [1726566353.440931] [modem0] [operation 10] default - enable: lock released --> Enable 1 finished <dbg> [1726566353.443238] [modem0] [operation 11] default - enable: lock acquired --> Enable 2 started <dbg> [1726566353.452984] [modem0] [operation 11] default - enable: lock released --> Enable 2 finished <dbg> [1726566353.517512] [modem0] [operation 12] default - disable: scheduled --> Disable 2 requested <dbg> [1726566353.517699] [modem0] [operation 12] default - disable: lock acquired --> Disable 2 started <dbg> [1726566353.688695] [modem0] [operation 12] default - disable: lock released --> Disable 2 finished <dbg> [1726566353.718237] [modem0] [operation 13] default - enable: scheduled --> Enable 3 requested <dbg> [1726566353.718417] [modem0] [operation 13] default - enable: lock acquired --> Enable 3 started <dbg> [1726566353.937122] [modem0] [operation 14] default - disable: scheduled --> Disable 3 requested <dbg> [1726566353.970791] [modem0] [operation 13] default - enable: lock released --> Enable 3 finished <dbg> [1726566353.970964] [modem0] [operation 14] default - disable: lock acquired --> Disable 3 started <dbg> [1726566354.170938] [modem0] [operation 14] default - disable: lock released --> Disable 3 finished
This commit is contained in:
+54
-59
@@ -78,49 +78,36 @@ struct _MMBaseModem {
|
||||
MMBaseModemPrivate *priv;
|
||||
};
|
||||
|
||||
/* Common state operation definitions */
|
||||
typedef void (* StateOperation) (MMBaseModem *self,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
typedef gboolean (*StateOperationFinish) (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
struct _MMBaseModemClass {
|
||||
MmGdbusObjectSkeletonClass parent;
|
||||
|
||||
/* Modem initialization.
|
||||
* As soon as the ports are organized, this method gets called */
|
||||
void (* initialize) (MMBaseModem *self,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean (*initialize_finish) (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
/* Modem initialization. As soon as the ports are organized, this method gets called */
|
||||
StateOperation initialize;
|
||||
StateOperationFinish initialize_finish;
|
||||
|
||||
/* Modem enabling.
|
||||
* User action requested from DBus, usually */
|
||||
void (* enable) (MMBaseModem *self,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean (*enable_finish) (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
/* Modem enabling. User action requested from DBus, usually */
|
||||
StateOperation enable;
|
||||
StateOperationFinish enable_finish;
|
||||
|
||||
/* Modem disabling.
|
||||
* User action requested from DBus, usually */
|
||||
void (* disable) (MMBaseModem *self,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean (*disable_finish) (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
/* Modem disabling. Either user action or internally triggered. */
|
||||
StateOperation disable;
|
||||
StateOperationFinish disable_finish;
|
||||
|
||||
#if defined WITH_SUSPEND_RESUME
|
||||
/* Modem synchronization.
|
||||
* When resuming in quick suspend/resume mode,
|
||||
* this method triggers a synchronization of all modem interfaces */
|
||||
void (* sync) (MMBaseModem *self,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean (* sync_finish) (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
StateOperation sync;
|
||||
StateOperationFinish sync_finish;
|
||||
#endif
|
||||
|
||||
/* Allow plugins to subclass port object creation as needed */
|
||||
@@ -271,37 +258,45 @@ gssize mm_base_modem_authorize_and_operation_lock_finish (MMBaseModem
|
||||
GError **error);
|
||||
|
||||
/******************************************************************************/
|
||||
/* State operations */
|
||||
|
||||
void mm_base_modem_initialize (MMBaseModem *self,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean mm_base_modem_initialize_finish (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
typedef enum {
|
||||
MM_BASE_MODEM_OPERATION_LOCK_REQUIRED,
|
||||
MM_BASE_MODEM_OPERATION_LOCK_ALREADY_ACQUIRED,
|
||||
} MMBaseModemOperationLock;
|
||||
|
||||
void mm_base_modem_enable (MMBaseModem *self,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean mm_base_modem_enable_finish (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
void mm_base_modem_initialize (MMBaseModem *self,
|
||||
MMBaseModemOperationLock operation_lock,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean mm_base_modem_initialize_finish (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
void mm_base_modem_disable (MMBaseModem *self,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean mm_base_modem_disable_finish (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
void mm_base_modem_enable (MMBaseModem *self,
|
||||
MMBaseModemOperationLock operation_lock,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean mm_base_modem_enable_finish (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
void mm_base_modem_disable (MMBaseModem *self,
|
||||
MMBaseModemOperationLock operation_lock,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean mm_base_modem_disable_finish (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
#if defined WITH_SUSPEND_RESUME
|
||||
|
||||
void mm_base_modem_sync (MMBaseModem *self,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean mm_base_modem_sync_finish (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
void mm_base_modem_sync (MMBaseModem *self,
|
||||
MMBaseModemOperationLock operation_lock,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean mm_base_modem_sync_finish (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
#endif
|
||||
|
||||
#endif /* MM_BASE_MODEM_H */
|
||||
|
||||
Reference in New Issue
Block a user