1 /***************************************************************************
2  * Copyright (c) 2024 Microsoft Corporation
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the MIT License which is available at
6  * https://opensource.org/licenses/MIT.
7  *
8  * SPDX-License-Identifier: MIT
9  **************************************************************************/
10 
11 
12 /**************************************************************************/
13 /**************************************************************************/
14 /**                                                                       */
15 /** GUIX Component                                                        */
16 /**                                                                       */
17 /**   System Management (System)                                          */
18 /**                                                                       */
19 /**************************************************************************/
20 
21 #define GX_SOURCE_CODE
22 
23 
24 /* Include necessary system files.  */
25 
26 #include "gx_api.h"
27 #include "gx_system.h"
28 
29 
30 /**************************************************************************/
31 /*                                                                        */
32 /*  FUNCTION                                               RELEASE        */
33 /*                                                                        */
34 /*    _gx_system_lock                                     PORTABLE C      */
35 /*                                                           6.1          */
36 /*  AUTHOR                                                                */
37 /*                                                                        */
38 /*    Kenneth Maxwell, Microsoft Corporation                              */
39 /*                                                                        */
40 /*  DESCRIPTION                                                           */
41 /*                                                                        */
42 /*    This function locks the GUIX system mutex                           */
43 /*                                                                        */
44 /*  INPUT                                                                 */
45 /*                                                                        */
46 /*    None                                                                */
47 /*                                                                        */
48 /*  OUTPUT                                                                */
49 /*                                                                        */
50 /*    None                                                                */
51 /*                                                                        */
52 /*  CALLS                                                                 */
53 /*                                                                        */
54 /*    tx_mutex_get                      Grab a mutex                      */
55 /*    _tx_thread_identify               Identify current thread           */
56 /*    _gx_system_error_process          Process an error                  */
57 /*                                                                        */
58 /*  CALLED BY                                                             */
59 /*                                                                        */
60 /*    GUIX Internal Code                                                  */
61 /*                                                                        */
62 /*  RELEASE HISTORY                                                       */
63 /*                                                                        */
64 /*    DATE              NAME                      DESCRIPTION             */
65 /*                                                                        */
66 /*  05-19-2020     Kenneth Maxwell          Initial Version 6.0           */
67 /*  09-30-2020     Kenneth Maxwell          Modified comment(s),          */
68 /*                                            resulting in version 6.1    */
69 /*                                                                        */
70 /**************************************************************************/
_gx_system_lock(VOID)71 VOID _gx_system_lock(VOID)
72 {
73 #ifdef GX_THREADX_BINDING
74 UINT protection_status;
75 #endif
76 
77     /* if the current thread already owns the GUIX system protection
78        then we don't need to lock again, just increment our nesting counter.
79        If no thread has yet locked GUIX or if the caller is not the owning
80        thread, then we need to request the gx_system_protect mutex.
81      */
82 
83     if (_gx_system_lock_thread != GX_CURRENT_THREAD)
84     {
85 #ifdef GX_THREADX_BINDING
86         protection_status =  tx_mutex_get(&_gx_system_protect, TX_WAIT_FOREVER);
87         /* Determine if we successfully obtained the protection.  */
88         if (protection_status)
89         {
90             /* Error obtaining protection - call system error handler.  */
91             _gx_system_error_process(GX_SYSTEM_PROTECTION_ERROR);
92 
93             /* Return to exit the system thread.  */
94             return;
95         }
96 #else
97         GX_SYSTEM_MUTEX_LOCK;
98 #endif
99 
100 
101 
102         /* save which thread owns the GUIX locked */
103         _gx_system_lock_thread = GX_CURRENT_THREAD;
104     }
105     _gx_system_lock_nesting++;
106 }
107 
108