source: mainline/uspace/lib/posix/test/pthread/keys.c

Last change on this file was da54714, checked in by GitHub <noreply@…>, 4 months ago

partially implement key-based pthread local storage (#245)

  • check for hash section presence in rtld
  • implement pthread thread-local storage keys without destructors and key recycling
  • Property mode set to 100644
File size: 2.4 KB
Line 
1/*
2 * Copyright (c) 2025 Matej Volf
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <fibril.h>
30#include <posix/pthread.h>
31#include <pcut/pcut.h>
32
33PCUT_INIT;
34
35PCUT_TEST_SUITE(pthread_keys);
36
37pthread_key_t key;
38
39static errno_t simple_fibril(void *_arg)
40{
41 PCUT_ASSERT_INT_EQUALS(0, pthread_setspecific(key, (void *) 0x0d9e));
42 PCUT_ASSERT_PTR_EQUALS((void *) 0x0d9e, pthread_getspecific(key));
43
44 for (int i = 0; i < 10; i++) {
45 fibril_yield();
46 }
47
48 return EOK;
49}
50
51PCUT_TEST(pthread_keys_basic)
52{
53 PCUT_ASSERT_INT_EQUALS(0, pthread_key_create(&key, NULL));
54 PCUT_ASSERT_PTR_EQUALS(NULL, pthread_getspecific(key));
55
56 PCUT_ASSERT_INT_EQUALS(0, pthread_setspecific(key, (void *) 0x42));
57 PCUT_ASSERT_PTR_EQUALS((void *) 0x42, pthread_getspecific(key));
58
59 fid_t other = fibril_create(simple_fibril, NULL);
60 fibril_start(other);
61
62 for (int i = 0; i < 5; i++) {
63 fibril_yield();
64 }
65
66 PCUT_ASSERT_PTR_EQUALS((void *) 0x42, pthread_getspecific(key));
67
68 for (int i = 0; i < 10; i++) {
69 fibril_yield();
70 }
71
72 PCUT_ASSERT_PTR_EQUALS((void *) 0x42, pthread_getspecific(key));
73}
74
75PCUT_EXPORT(pthread_keys);
Note: See TracBrowser for help on using the repository browser.