Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:21

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup RTEMSTestFrameworkImpl
0007  *
0008  * @brief This source file contains the implementation of
0009  *   T_check_posix_keys().
0010  */
0011 
0012 /*
0013  * Copyright (C) 2018 embedded brains GmbH & Co. KG
0014  *
0015  * Redistribution and use in source and binary forms, with or without
0016  * modification, are permitted provided that the following conditions
0017  * are met:
0018  * 1. Redistributions of source code must retain the above copyright
0019  *    notice, this list of conditions and the following disclaimer.
0020  * 2. Redistributions in binary form must reproduce the above copyright
0021  *    notice, this list of conditions and the following disclaimer in the
0022  *    documentation and/or other materials provided with the distribution.
0023  *
0024  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0025  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0026  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0027  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0028  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0029  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0030  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0031  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0032  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0033  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0034  * POSSIBILITY OF SUCH DAMAGE.
0035  */
0036 
0037 #undef __STRICT_ANSI__
0038 
0039 #include "t-test-rtems.h"
0040 
0041 #include <rtems/test.h>
0042 
0043 #include <rtems/posix/keyimpl.h>
0044 
0045 static Objects_Maximum T_posix_key_count;
0046 
0047 static ssize_t T_posix_key_value_count;
0048 
0049 static POSIX_Keys_Control *
0050 T_get_next_posix_key(Objects_Id *id)
0051 {
0052     return (POSIX_Keys_Control *)
0053         _Objects_Get_next(*id, &_POSIX_Keys_Information, id);
0054 }
0055 
0056 static ssize_t
0057 T_get_active_posix_key_value_pairs(void)
0058 {
0059     ssize_t count;
0060     Objects_Id id;
0061     POSIX_Keys_Control *the_key;
0062 
0063     count = 0;
0064     id = OBJECTS_ID_INITIAL_INDEX;
0065 
0066     while ((the_key = T_get_next_posix_key(&id)) != NULL ) {
0067         count += (ssize_t)
0068             _Chain_Node_count_unprotected(&the_key->Key_value_pairs);
0069         _Objects_Allocator_unlock();
0070     }
0071 
0072     return count;
0073 }
0074 
0075 static void
0076 T_posix_keys_run_initialize(void)
0077 {
0078     T_posix_key_count = T_objects_count(OBJECTS_POSIX_API,
0079         OBJECTS_POSIX_KEYS);
0080     T_posix_key_value_count = T_get_active_posix_key_value_pairs();
0081 }
0082 
0083 static void
0084 T_posix_keys_case_end(void)
0085 {
0086     ssize_t count;
0087     ssize_t delta;
0088 
0089     T_objects_check(OBJECTS_POSIX_API, OBJECTS_POSIX_KEYS,
0090         &T_posix_key_count, "POSIX key");
0091 
0092     count = T_get_active_posix_key_value_pairs();
0093     delta = count - T_posix_key_value_count;
0094 
0095     if (delta != 0) {
0096         T_posix_key_value_count = count;
0097         T_check(&T_special, false, "POSIX key value pair leak (%zi)",
0098             delta);
0099     }
0100 }
0101 
0102 void
0103 T_check_posix_keys(T_event event, const char *name)
0104 {
0105     (void)name;
0106 
0107     switch (event) {
0108     case T_EVENT_RUN_INITIALIZE_EARLY:
0109         T_posix_keys_run_initialize();
0110         break;
0111     case T_EVENT_CASE_END:
0112         T_posix_keys_case_end();
0113         break;
0114     default:
0115         break;
0116     };
0117 }