Differences From Artifact [5afa8ac0c0]:
- File src/runtime/synchronized.m — part of check-in [27834a3103] at 2017-06-05 19:12:48 on branch trunk — runtime: Fix missing static (user: js, size: 2757) [annotate] [blame] [check-ins using] [more...]
To Artifact [aae42e3525]:
- File
src/runtime/synchronized.m
— part of check-in
[79011c5f56]
at
2017-06-07 21:38:21
on branch trunk
— runtime: Move all globals into a single struct
This is required to create a .library on MorphOS. (user: js, size: 2966) [annotate] [blame] [check-ins using]
︙ | ︙ | |||
18 19 20 21 22 23 24 25 26 27 | #include <stdio.h> #include <stdlib.h> #import "runtime.h" #import "runtime-private.h" #ifdef OF_HAVE_THREADS # import "threading.h" | > > > > < < < < < < < < < | | | | | | | | | | | | | | | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | #include <stdio.h> #include <stdlib.h> #import "runtime.h" #import "runtime-private.h" #import "globals.h" #define synchronized_locks objc_globals.synchronized_locks #define synchronized_locks_lock objc_globals.synchronized_locks_lock #ifdef OF_HAVE_THREADS # import "threading.h" OF_CONSTRUCTOR() { if (!of_mutex_new(&synchronized_locks_lock)) OBJC_ERROR("Failed to create mutex!") } #endif int objc_sync_enter(id object) { if (object == nil) return 0; #ifdef OF_HAVE_THREADS struct synchronized_lock *lock; if (!of_mutex_lock(&synchronized_locks_lock)) OBJC_ERROR("Failed to lock mutex!"); /* Look if we already have a lock */ for (lock = synchronized_locks; lock != NULL; lock = lock->next) { if (lock->object != object) continue; lock->count++; if (!of_mutex_unlock(&synchronized_locks_lock)) OBJC_ERROR("Failed to unlock mutex!"); if (!of_rmutex_lock(&lock->rmutex)) OBJC_ERROR("Failed to lock mutex!"); return 0; } /* Create a new lock */ if ((lock = malloc(sizeof(*lock))) == NULL) OBJC_ERROR("Failed to allocate memory for mutex!"); if (!of_rmutex_new(&lock->rmutex)) OBJC_ERROR("Failed to create mutex!"); lock->object = object; lock->count = 1; lock->next = synchronized_locks; synchronized_locks = lock; if (!of_mutex_unlock(&synchronized_locks_lock)) OBJC_ERROR("Failed to unlock mutex!"); if (!of_rmutex_lock(&lock->rmutex)) OBJC_ERROR("Failed to lock mutex!"); #endif return 0; } int objc_sync_exit(id object) { if (object == nil) return 0; #ifdef OF_HAVE_THREADS struct synchronized_lock *lock, *last = NULL; if (!of_mutex_lock(&synchronized_locks_lock)) OBJC_ERROR("Failed to lock mutex!"); for (lock = synchronized_locks; lock != NULL; lock = lock->next) { if (lock->object != object) { last = lock; continue; } if (!of_rmutex_unlock(&lock->rmutex)) OBJC_ERROR("Failed to unlock mutex!"); if (--lock->count == 0) { if (!of_rmutex_free(&lock->rmutex)) OBJC_ERROR("Failed to destroy mutex!"); if (last != NULL) last->next = lock->next; if (synchronized_locks == lock) synchronized_locks = lock->next; free(lock); } if (!of_mutex_unlock(&synchronized_locks_lock)) OBJC_ERROR("Failed to unlock mutex!"); return 0; } OBJC_ERROR("objc_sync_exit() was called for an object not locked!"); #else return 0; #endif } |