threads_none.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*
  2. * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  4. * Licensed under the OpenSSL license (the "License"). You may not use
  5. * this file except in compliance with the License. You can obtain a copy
  6. * in the file LICENSE in the source distribution or at
  7. * https://www.openssl.org/source/license.html
  8. */
  9. #include <openssl/crypto.h>
  10. #include "internal/cryptlib.h"
  11. #if !defined(OPENSSL_THREADS) || defined(CRYPTO_TDEBUG)
  12. CRYPTO_RWLOCK *CRYPTO_THREAD_lock_new(void)
  13. {
  14. CRYPTO_RWLOCK *lock = OPENSSL_zalloc(sizeof(unsigned int));
  15. if (lock == NULL)
  16. return NULL;
  17. *(unsigned int *)lock = 1;
  18. return lock;
  19. }
  20. int CRYPTO_THREAD_read_lock(CRYPTO_RWLOCK *lock)
  21. {
  22. if (!ossl_assert(*(unsigned int *)lock == 1))
  23. return 0;
  24. return 1;
  25. }
  26. int CRYPTO_THREAD_write_lock(CRYPTO_RWLOCK *lock)
  27. {
  28. if (!ossl_assert(*(unsigned int *)lock == 1))
  29. return 0;
  30. return 1;
  31. }
  32. int CRYPTO_THREAD_unlock(CRYPTO_RWLOCK *lock)
  33. {
  34. if (!ossl_assert(*(unsigned int *)lock == 1))
  35. return 0;
  36. return 1;
  37. }
  38. void CRYPTO_THREAD_lock_free(CRYPTO_RWLOCK *lock) {
  39. if (lock == NULL)
  40. return;
  41. *(unsigned int *)lock = 0;
  42. OPENSSL_free(lock);
  43. return;
  44. }
  45. int CRYPTO_THREAD_run_once(CRYPTO_ONCE *once, void (*init)(void))
  46. {
  47. if (*once != 0)
  48. return 1;
  49. init();
  50. *once = 1;
  51. return 1;
  52. }
  53. #define OPENSSL_CRYPTO_THREAD_LOCAL_KEY_MAX 256
  54. static void *thread_local_storage[OPENSSL_CRYPTO_THREAD_LOCAL_KEY_MAX];
  55. int CRYPTO_THREAD_init_local(CRYPTO_THREAD_LOCAL *key, void (*cleanup)(void *))
  56. {
  57. static unsigned int thread_local_key = 0;
  58. if (thread_local_key >= OPENSSL_CRYPTO_THREAD_LOCAL_KEY_MAX)
  59. return 0;
  60. *key = thread_local_key++;
  61. thread_local_storage[*key] = NULL;
  62. return 1;
  63. }
  64. void *CRYPTO_THREAD_get_local(CRYPTO_THREAD_LOCAL *key)
  65. {
  66. if (*key >= OPENSSL_CRYPTO_THREAD_LOCAL_KEY_MAX)
  67. return NULL;
  68. return thread_local_storage[*key];
  69. }
  70. int CRYPTO_THREAD_set_local(CRYPTO_THREAD_LOCAL *key, void *val)
  71. {
  72. if (*key >= OPENSSL_CRYPTO_THREAD_LOCAL_KEY_MAX)
  73. return 0;
  74. thread_local_storage[*key] = val;
  75. return 1;
  76. }
  77. int CRYPTO_THREAD_cleanup_local(CRYPTO_THREAD_LOCAL *key)
  78. {
  79. *key = OPENSSL_CRYPTO_THREAD_LOCAL_KEY_MAX + 1;
  80. return 1;
  81. }
  82. CRYPTO_THREAD_ID CRYPTO_THREAD_get_current_id(void)
  83. {
  84. return 0;
  85. }
  86. int CRYPTO_THREAD_compare_id(CRYPTO_THREAD_ID a, CRYPTO_THREAD_ID b)
  87. {
  88. return (a == b);
  89. }
  90. int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
  91. {
  92. *val += amount;
  93. *ret = *val;
  94. return 1;
  95. }
  96. int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock)
  97. {
  98. *ret = *val;
  99. return 1;
  100. }
  101. int CRYPTO_atomic_write(int *val, int n, CRYPTO_RWLOCK *lock)
  102. {
  103. *val = n;
  104. return 1;
  105. }
  106. int openssl_init_fork_handlers(void)
  107. {
  108. return 0;
  109. }
  110. #endif