noderb 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +19 -0
- data/README.md +25 -0
- data/ext/noderb_extension/extconf.rb +11 -0
- data/ext/noderb_extension/libuv/AUTHORS +11 -0
- data/ext/noderb_extension/libuv/LICENSE +48 -0
- data/ext/noderb_extension/libuv/Makefile +119 -0
- data/ext/noderb_extension/libuv/README +45 -0
- data/ext/noderb_extension/libuv/build/all.gyp +254 -0
- data/ext/noderb_extension/libuv/build/common.gypi +13 -0
- data/ext/noderb_extension/libuv/build/gyp_uv +43 -0
- data/ext/noderb_extension/libuv/config-mingw.mk +67 -0
- data/ext/noderb_extension/libuv/config-unix.mk +121 -0
- data/ext/noderb_extension/libuv/create-msvs-files.bat +14 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ANNOUNCE +482 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/BUGS +141 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/Bmakefile +268 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/CONTRIBUTORS +140 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/COPYING +150 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/COPYING.LIB +504 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ChangeLog +5194 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/FAQ +451 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/GNUmakefile +593 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/MAINTAINERS +4 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/Makefile +516 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/NEWS +1245 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/Nmakefile +24 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/Nmakefile.tests +260 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/PROGRESS +4 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/README +601 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/README.Borland +57 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/README.CV +3036 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/README.NONPORTABLE +783 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/README.Watcom +62 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/README.WinCE +6 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/TODO +7 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/WinCE-PORT +222 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/attr.c +53 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/autostatic.c +69 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/barrier.c +47 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/build/all.gyp +207 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/builddmc.bat +9 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/cancel.c +44 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/cleanup.c +148 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/condvar.c +50 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/config.h +153 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/context.h +74 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/create.c +308 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/dll.c +92 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/errno.c +94 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/exit.c +44 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/fork.c +39 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/global.c +107 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/implement.h +944 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/misc.c +50 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/mutex.c +62 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/need_errno.h +145 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/nonportable.c +47 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/private.c +54 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread.c +66 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread.dsp +142 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread.dsw +29 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread.h +1368 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_destroy.c +79 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getdetachstate.c +86 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getinheritsched.c +51 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getschedparam.c +52 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getschedpolicy.c +61 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getscope.c +54 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getstackaddr.c +97 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getstacksize.c +100 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_init.c +117 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setdetachstate.c +91 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setinheritsched.c +57 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setschedparam.c +63 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setschedpolicy.c +55 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setscope.c +62 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setstackaddr.c +97 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setstacksize.c +110 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrier_destroy.c +103 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrier_init.c +69 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrier_wait.c +104 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrierattr_destroy.c +83 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrierattr_getpshared.c +95 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrierattr_init.c +85 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrierattr_setpshared.c +119 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_cancel.c +189 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_cond_destroy.c +253 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_cond_init.c +167 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_cond_signal.c +231 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_cond_wait.c +567 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_condattr_destroy.c +86 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_condattr_getpshared.c +97 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_condattr_init.c +87 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_condattr_setpshared.c +117 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_delay_np.c +172 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_detach.c +136 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_equal.c +76 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_exit.c +106 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_getconcurrency.c +45 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_getschedparam.c +75 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_getspecific.c +87 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_getunique_np.c +47 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_getw32threadhandle_np.c +65 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_join.c +157 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_key_create.c +108 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_key_delete.c +125 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_kill.c +105 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_consistent.c +187 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_destroy.c +148 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_init.c +130 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_lock.c +269 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_timedlock.c +324 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_trylock.c +154 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_unlock.c +175 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_destroy.c +83 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_getkind_np.c +44 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_getpshared.c +95 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_getrobust.c +113 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_gettype.c +56 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_init.c +86 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_setkind_np.c +44 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_setpshared.c +119 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_setrobust.c +119 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_settype.c +143 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_num_processors_np.c +56 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_once.c +79 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_destroy.c +143 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_init.c +109 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_rdlock.c +102 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_timedrdlock.c +109 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_timedwrlock.c +139 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_tryrdlock.c +102 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_trywrlock.c +122 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_unlock.c +93 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_wrlock.c +133 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlockattr_destroy.c +84 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlockattr_getpshared.c +97 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlockattr_init.c +83 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlockattr_setpshared.c +120 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_self.c +141 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_setcancelstate.c +125 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_setcanceltype.c +126 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_setconcurrency.c +53 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_setschedparam.c +123 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_setspecific.c +167 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_spin_destroy.c +111 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_spin_init.c +123 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_spin_lock.c +80 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_spin_trylock.c +77 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_spin_unlock.c +71 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_testcancel.c +103 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_timechange_handler_np.c +108 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_win32_attach_detach_np.c +258 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_MCS_lock.c +278 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_callUserDestroyRoutines.c +232 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_calloc.c +56 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_cond_check_need_init.c +78 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_getprocessors.c +91 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_is_attr.c +47 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_mutex_check_need_init.c +92 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_new.c +94 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_processInitialize.c +92 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_processTerminate.c +105 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_relmillisecs.c +132 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_reuse.c +151 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_rwlock_cancelwrwait.c +50 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_rwlock_check_need_init.c +77 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_semwait.c +135 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_spinlock_check_need_init.c +78 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_threadDestroy.c +79 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_threadStart.c +357 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_throw.c +189 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_timespec.c +83 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_tkAssocCreate.c +118 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_tkAssocDestroy.c +114 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/rwlock.c +51 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sched.c +53 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sched.h +183 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sched_get_priority_max.c +134 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sched_get_priority_min.c +135 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sched_getscheduler.c +71 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sched_setscheduler.c +83 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sched_yield.c +71 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sem_close.c +58 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sem_destroy.c +144 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sem_getvalue.c +110 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sem_init.c +169 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sem_open.c +58 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sem_post.c +128 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sem_post_multiple.c +142 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sem_timedwait.c +238 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sem_trywait.c +117 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sem_unlink.c +58 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sem_wait.c +187 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/semaphore.c +69 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/semaphore.h +169 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/signal.c +179 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/spin.c +46 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/sync.c +43 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/tsd.c +44 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/version.rc +388 -0
- data/ext/noderb_extension/libuv/deps/pthread-win32/w32_CancelableWait.c +161 -0
- data/ext/noderb_extension/libuv/doc/desired-api.md +159 -0
- data/ext/noderb_extension/libuv/doc/iocp-links.html +574 -0
- data/ext/noderb_extension/libuv/include/ares.h +582 -0
- data/ext/noderb_extension/libuv/include/ares_version.h +24 -0
- data/ext/noderb_extension/libuv/include/eio.h +376 -0
- data/ext/noderb_extension/libuv/include/ev.h +835 -0
- data/ext/noderb_extension/libuv/include/ngx-queue.h +102 -0
- data/ext/noderb_extension/libuv/include/tree.h +762 -0
- data/ext/noderb_extension/libuv/include/uv-unix.h +138 -0
- data/ext/noderb_extension/libuv/include/uv-win.h +187 -0
- data/ext/noderb_extension/libuv/include/uv.h +635 -0
- data/ext/noderb_extension/libuv/src/ares/AUTHORS +37 -0
- data/ext/noderb_extension/libuv/src/ares/CHANGES +1198 -0
- data/ext/noderb_extension/libuv/src/ares/CMakeLists.txt +22 -0
- data/ext/noderb_extension/libuv/src/ares/NEWS +21 -0
- data/ext/noderb_extension/libuv/src/ares/README +60 -0
- data/ext/noderb_extension/libuv/src/ares/README.cares +13 -0
- data/ext/noderb_extension/libuv/src/ares/README.msvc +118 -0
- data/ext/noderb_extension/libuv/src/ares/README.node +21 -0
- data/ext/noderb_extension/libuv/src/ares/RELEASE-NOTES +25 -0
- data/ext/noderb_extension/libuv/src/ares/TODO +23 -0
- data/ext/noderb_extension/libuv/src/ares/ares__close_sockets.c +66 -0
- data/ext/noderb_extension/libuv/src/ares/ares__get_hostent.c +263 -0
- data/ext/noderb_extension/libuv/src/ares/ares__read_line.c +71 -0
- data/ext/noderb_extension/libuv/src/ares/ares__timeval.c +111 -0
- data/ext/noderb_extension/libuv/src/ares/ares_cancel.c +63 -0
- data/ext/noderb_extension/libuv/src/ares/ares_data.c +190 -0
- data/ext/noderb_extension/libuv/src/ares/ares_data.h +65 -0
- data/ext/noderb_extension/libuv/src/ares/ares_destroy.c +105 -0
- data/ext/noderb_extension/libuv/src/ares/ares_dns.h +90 -0
- data/ext/noderb_extension/libuv/src/ares/ares_expand_name.c +193 -0
- data/ext/noderb_extension/libuv/src/ares/ares_expand_string.c +75 -0
- data/ext/noderb_extension/libuv/src/ares/ares_fds.c +62 -0
- data/ext/noderb_extension/libuv/src/ares/ares_free_hostent.c +39 -0
- data/ext/noderb_extension/libuv/src/ares/ares_free_string.c +25 -0
- data/ext/noderb_extension/libuv/src/ares/ares_gethostbyaddr.c +292 -0
- data/ext/noderb_extension/libuv/src/ares/ares_gethostbyname.c +515 -0
- data/ext/noderb_extension/libuv/src/ares/ares_getnameinfo.c +426 -0
- data/ext/noderb_extension/libuv/src/ares/ares_getopt.c +122 -0
- data/ext/noderb_extension/libuv/src/ares/ares_getopt.h +53 -0
- data/ext/noderb_extension/libuv/src/ares/ares_getsock.c +72 -0
- data/ext/noderb_extension/libuv/src/ares/ares_init.c +1665 -0
- data/ext/noderb_extension/libuv/src/ares/ares_ipv6.h +78 -0
- data/ext/noderb_extension/libuv/src/ares/ares_library_init.c +132 -0
- data/ext/noderb_extension/libuv/src/ares/ares_library_init.h +39 -0
- data/ext/noderb_extension/libuv/src/ares/ares_llist.c +86 -0
- data/ext/noderb_extension/libuv/src/ares/ares_llist.h +42 -0
- data/ext/noderb_extension/libuv/src/ares/ares_mkquery.c +195 -0
- data/ext/noderb_extension/libuv/src/ares/ares_nowarn.c +59 -0
- data/ext/noderb_extension/libuv/src/ares/ares_nowarn.h +24 -0
- data/ext/noderb_extension/libuv/src/ares/ares_options.c +253 -0
- data/ext/noderb_extension/libuv/src/ares/ares_parse_a_reply.c +260 -0
- data/ext/noderb_extension/libuv/src/ares/ares_parse_aaaa_reply.c +256 -0
- data/ext/noderb_extension/libuv/src/ares/ares_parse_mx_reply.c +170 -0
- data/ext/noderb_extension/libuv/src/ares/ares_parse_ns_reply.c +182 -0
- data/ext/noderb_extension/libuv/src/ares/ares_parse_ptr_reply.c +208 -0
- data/ext/noderb_extension/libuv/src/ares/ares_parse_srv_reply.c +179 -0
- data/ext/noderb_extension/libuv/src/ares/ares_parse_txt_reply.c +201 -0
- data/ext/noderb_extension/libuv/src/ares/ares_private.h +351 -0
- data/ext/noderb_extension/libuv/src/ares/ares_process.c +1296 -0
- data/ext/noderb_extension/libuv/src/ares/ares_query.c +183 -0
- data/ext/noderb_extension/libuv/src/ares/ares_rules.h +144 -0
- data/ext/noderb_extension/libuv/src/ares/ares_search.c +322 -0
- data/ext/noderb_extension/libuv/src/ares/ares_send.c +134 -0
- data/ext/noderb_extension/libuv/src/ares/ares_setup.h +191 -0
- data/ext/noderb_extension/libuv/src/ares/ares_strcasecmp.c +66 -0
- data/ext/noderb_extension/libuv/src/ares/ares_strcasecmp.h +30 -0
- data/ext/noderb_extension/libuv/src/ares/ares_strdup.c +42 -0
- data/ext/noderb_extension/libuv/src/ares/ares_strdup.h +26 -0
- data/ext/noderb_extension/libuv/src/ares/ares_strerror.c +56 -0
- data/ext/noderb_extension/libuv/src/ares/ares_timeout.c +80 -0
- data/ext/noderb_extension/libuv/src/ares/ares_version.c +11 -0
- data/ext/noderb_extension/libuv/src/ares/ares_writev.c +79 -0
- data/ext/noderb_extension/libuv/src/ares/ares_writev.h +36 -0
- data/ext/noderb_extension/libuv/src/ares/bitncmp.c +59 -0
- data/ext/noderb_extension/libuv/src/ares/bitncmp.h +26 -0
- data/ext/noderb_extension/libuv/src/ares/config_cygwin/ares_config.h +510 -0
- data/ext/noderb_extension/libuv/src/ares/config_darwin/ares_config.h +510 -0
- data/ext/noderb_extension/libuv/src/ares/config_freebsd/ares_config.h +510 -0
- data/ext/noderb_extension/libuv/src/ares/config_linux/ares_config.h +510 -0
- data/ext/noderb_extension/libuv/src/ares/config_openbsd/ares_config.h +510 -0
- data/ext/noderb_extension/libuv/src/ares/config_sunos/ares_config.h +510 -0
- data/ext/noderb_extension/libuv/src/ares/config_win32/ares_config.h +369 -0
- data/ext/noderb_extension/libuv/src/ares/get_ver.awk +35 -0
- data/ext/noderb_extension/libuv/src/ares/inet_net_pton.c +450 -0
- data/ext/noderb_extension/libuv/src/ares/inet_net_pton.h +31 -0
- data/ext/noderb_extension/libuv/src/ares/inet_ntop.c +232 -0
- data/ext/noderb_extension/libuv/src/ares/inet_ntop.h +27 -0
- data/ext/noderb_extension/libuv/src/ares/nameser.h +193 -0
- data/ext/noderb_extension/libuv/src/ares/setup_once.h +488 -0
- data/ext/noderb_extension/libuv/src/ares/windows_port.c +22 -0
- data/ext/noderb_extension/libuv/src/eio/Changes +63 -0
- data/ext/noderb_extension/libuv/src/eio/LICENSE +36 -0
- data/ext/noderb_extension/libuv/src/eio/Makefile.am +15 -0
- data/ext/noderb_extension/libuv/src/eio/aclocal.m4 +8957 -0
- data/ext/noderb_extension/libuv/src/eio/autogen.sh +3 -0
- data/ext/noderb_extension/libuv/src/eio/config.h.in +86 -0
- data/ext/noderb_extension/libuv/src/eio/config_cygwin.h +77 -0
- data/ext/noderb_extension/libuv/src/eio/config_darwin.h +137 -0
- data/ext/noderb_extension/libuv/src/eio/config_freebsd.h +78 -0
- data/ext/noderb_extension/libuv/src/eio/config_linux.h +101 -0
- data/ext/noderb_extension/libuv/src/eio/config_sunos.h +81 -0
- data/ext/noderb_extension/libuv/src/eio/configure.ac +22 -0
- data/ext/noderb_extension/libuv/src/eio/demo.c +194 -0
- data/ext/noderb_extension/libuv/src/eio/ecb.h +370 -0
- data/ext/noderb_extension/libuv/src/eio/eio.3 +3428 -0
- data/ext/noderb_extension/libuv/src/eio/eio.c +2562 -0
- data/ext/noderb_extension/libuv/src/eio/eio.pod +969 -0
- data/ext/noderb_extension/libuv/src/eio/libeio.m4 +195 -0
- data/ext/noderb_extension/libuv/src/eio/xthread.h +164 -0
- data/ext/noderb_extension/libuv/src/ev/Changes +388 -0
- data/ext/noderb_extension/libuv/src/ev/LICENSE +36 -0
- data/ext/noderb_extension/libuv/src/ev/Makefile.am +18 -0
- data/ext/noderb_extension/libuv/src/ev/Makefile.in +771 -0
- data/ext/noderb_extension/libuv/src/ev/README +58 -0
- data/ext/noderb_extension/libuv/src/ev/aclocal.m4 +8957 -0
- data/ext/noderb_extension/libuv/src/ev/autogen.sh +6 -0
- data/ext/noderb_extension/libuv/src/ev/config.guess +1526 -0
- data/ext/noderb_extension/libuv/src/ev/config.h.in +125 -0
- data/ext/noderb_extension/libuv/src/ev/config.sub +1658 -0
- data/ext/noderb_extension/libuv/src/ev/config_cygwin.h +123 -0
- data/ext/noderb_extension/libuv/src/ev/config_darwin.h +122 -0
- data/ext/noderb_extension/libuv/src/ev/config_freebsd.h +120 -0
- data/ext/noderb_extension/libuv/src/ev/config_linux.h +130 -0
- data/ext/noderb_extension/libuv/src/ev/config_sunos.h +122 -0
- data/ext/noderb_extension/libuv/src/ev/configure +13037 -0
- data/ext/noderb_extension/libuv/src/ev/configure.ac +18 -0
- data/ext/noderb_extension/libuv/src/ev/depcomp +630 -0
- data/ext/noderb_extension/libuv/src/ev/ev++.h +816 -0
- data/ext/noderb_extension/libuv/src/ev/ev.3 +5311 -0
- data/ext/noderb_extension/libuv/src/ev/ev.c +3913 -0
- data/ext/noderb_extension/libuv/src/ev/ev.pod +5243 -0
- data/ext/noderb_extension/libuv/src/ev/ev_epoll.c +266 -0
- data/ext/noderb_extension/libuv/src/ev/ev_kqueue.c +198 -0
- data/ext/noderb_extension/libuv/src/ev/ev_poll.c +148 -0
- data/ext/noderb_extension/libuv/src/ev/ev_port.c +179 -0
- data/ext/noderb_extension/libuv/src/ev/ev_select.c +310 -0
- data/ext/noderb_extension/libuv/src/ev/ev_vars.h +203 -0
- data/ext/noderb_extension/libuv/src/ev/ev_win32.c +153 -0
- data/ext/noderb_extension/libuv/src/ev/ev_wrap.h +196 -0
- data/ext/noderb_extension/libuv/src/ev/event.c +402 -0
- data/ext/noderb_extension/libuv/src/ev/event.h +170 -0
- data/ext/noderb_extension/libuv/src/ev/install-sh +294 -0
- data/ext/noderb_extension/libuv/src/ev/libev.m4 +39 -0
- data/ext/noderb_extension/libuv/src/ev/ltmain.sh +8413 -0
- data/ext/noderb_extension/libuv/src/ev/missing +336 -0
- data/ext/noderb_extension/libuv/src/ev/mkinstalldirs +111 -0
- data/ext/noderb_extension/libuv/src/uv-common.c +172 -0
- data/ext/noderb_extension/libuv/src/uv-common.h +53 -0
- data/ext/noderb_extension/libuv/src/uv-cygwin.c +52 -0
- data/ext/noderb_extension/libuv/src/uv-darwin.c +64 -0
- data/ext/noderb_extension/libuv/src/uv-eio.c +113 -0
- data/ext/noderb_extension/libuv/src/uv-eio.h +13 -0
- data/ext/noderb_extension/libuv/src/uv-freebsd.c +65 -0
- data/ext/noderb_extension/libuv/src/uv-linux.c +51 -0
- data/ext/noderb_extension/libuv/src/uv-sunos.c +60 -0
- data/ext/noderb_extension/libuv/src/uv-unix.c +2408 -0
- data/ext/noderb_extension/libuv/src/win/async.c +129 -0
- data/ext/noderb_extension/libuv/src/win/cares.c +304 -0
- data/ext/noderb_extension/libuv/src/win/core.c +155 -0
- data/ext/noderb_extension/libuv/src/win/error.c +140 -0
- data/ext/noderb_extension/libuv/src/win/getaddrinfo.c +341 -0
- data/ext/noderb_extension/libuv/src/win/handle.c +176 -0
- data/ext/noderb_extension/libuv/src/win/internal.h +237 -0
- data/ext/noderb_extension/libuv/src/win/loop-watcher.c +128 -0
- data/ext/noderb_extension/libuv/src/win/pipe.c +828 -0
- data/ext/noderb_extension/libuv/src/win/process.c +936 -0
- data/ext/noderb_extension/libuv/src/win/req.c +141 -0
- data/ext/noderb_extension/libuv/src/win/stdio.c +75 -0
- data/ext/noderb_extension/libuv/src/win/stream.c +149 -0
- data/ext/noderb_extension/libuv/src/win/tcp.c +895 -0
- data/ext/noderb_extension/libuv/src/win/timer.c +269 -0
- data/ext/noderb_extension/libuv/src/win/util.c +82 -0
- data/ext/noderb_extension/libuv/test/benchmark-ares.c +117 -0
- data/ext/noderb_extension/libuv/test/benchmark-getaddrinfo.c +90 -0
- data/ext/noderb_extension/libuv/test/benchmark-list.h +77 -0
- data/ext/noderb_extension/libuv/test/benchmark-ping-pongs.c +210 -0
- data/ext/noderb_extension/libuv/test/benchmark-pound.c +237 -0
- data/ext/noderb_extension/libuv/test/benchmark-pump.c +459 -0
- data/ext/noderb_extension/libuv/test/benchmark-sizes.c +39 -0
- data/ext/noderb_extension/libuv/test/benchmark-spawn.c +154 -0
- data/ext/noderb_extension/libuv/test/dns-server.c +323 -0
- data/ext/noderb_extension/libuv/test/echo-server.c +299 -0
- data/ext/noderb_extension/libuv/test/run-benchmarks.c +64 -0
- data/ext/noderb_extension/libuv/test/run-tests.c +82 -0
- data/ext/noderb_extension/libuv/test/runner-unix.c +335 -0
- data/ext/noderb_extension/libuv/test/runner-unix.h +36 -0
- data/ext/noderb_extension/libuv/test/runner-win.c +343 -0
- data/ext/noderb_extension/libuv/test/runner-win.h +42 -0
- data/ext/noderb_extension/libuv/test/runner.c +311 -0
- data/ext/noderb_extension/libuv/test/runner.h +155 -0
- data/ext/noderb_extension/libuv/test/task.h +111 -0
- data/ext/noderb_extension/libuv/test/test-async.c +218 -0
- data/ext/noderb_extension/libuv/test/test-callback-stack.c +205 -0
- data/ext/noderb_extension/libuv/test/test-connection-fail.c +149 -0
- data/ext/noderb_extension/libuv/test/test-delayed-accept.c +198 -0
- data/ext/noderb_extension/libuv/test/test-fail-always.c +29 -0
- data/ext/noderb_extension/libuv/test/test-get-currentexe.c +53 -0
- data/ext/noderb_extension/libuv/test/test-getaddrinfo.c +110 -0
- data/ext/noderb_extension/libuv/test/test-gethostbyname.c +192 -0
- data/ext/noderb_extension/libuv/test/test-getsockname.c +196 -0
- data/ext/noderb_extension/libuv/test/test-hrtime.c +51 -0
- data/ext/noderb_extension/libuv/test/test-idle.c +83 -0
- data/ext/noderb_extension/libuv/test/test-list.h +165 -0
- data/ext/noderb_extension/libuv/test/test-loop-handles.c +361 -0
- data/ext/noderb_extension/libuv/test/test-pass-always.c +28 -0
- data/ext/noderb_extension/libuv/test/test-ping-pong.c +256 -0
- data/ext/noderb_extension/libuv/test/test-pipe-bind-error.c +148 -0
- data/ext/noderb_extension/libuv/test/test-ref.c +91 -0
- data/ext/noderb_extension/libuv/test/test-shutdown-eof.c +183 -0
- data/ext/noderb_extension/libuv/test/test-spawn.c +345 -0
- data/ext/noderb_extension/libuv/test/test-tcp-bind-error.c +204 -0
- data/ext/noderb_extension/libuv/test/test-tcp-bind6-error.c +164 -0
- data/ext/noderb_extension/libuv/test/test-tcp-writealot.c +198 -0
- data/ext/noderb_extension/libuv/test/test-timer-again.c +141 -0
- data/ext/noderb_extension/libuv/test/test-timer.c +134 -0
- data/ext/noderb_extension/noderb.c +340 -0
- data/ext/noderb_extension/noderb.h +2 -0
- data/lib/noderb/connection.rb +21 -0
- data/lib/noderb/process.rb +17 -0
- data/lib/noderb.rb +25 -0
- metadata +470 -0
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ptw32_MCS_lock.c
|
|
3
|
+
*
|
|
4
|
+
* Description:
|
|
5
|
+
* This translation unit implements queue-based locks.
|
|
6
|
+
*
|
|
7
|
+
* --------------------------------------------------------------------------
|
|
8
|
+
*
|
|
9
|
+
* Pthreads-win32 - POSIX Threads Library for Win32
|
|
10
|
+
* Copyright(C) 1998 John E. Bossom
|
|
11
|
+
* Copyright(C) 1999,2005 Pthreads-win32 contributors
|
|
12
|
+
*
|
|
13
|
+
* Contact Email: rpj@callisto.canberra.edu.au
|
|
14
|
+
*
|
|
15
|
+
* The current list of contributors is contained
|
|
16
|
+
* in the file CONTRIBUTORS included with the source
|
|
17
|
+
* code distribution. The list can also be seen at the
|
|
18
|
+
* following World Wide Web location:
|
|
19
|
+
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|
20
|
+
*
|
|
21
|
+
* This library is free software; you can redistribute it and/or
|
|
22
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
23
|
+
* License as published by the Free Software Foundation; either
|
|
24
|
+
* version 2 of the License, or (at your option) any later version.
|
|
25
|
+
*
|
|
26
|
+
* This library is distributed in the hope that it will be useful,
|
|
27
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
28
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
29
|
+
* Lesser General Public License for more details.
|
|
30
|
+
*
|
|
31
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
32
|
+
* License along with this library in the file COPYING.LIB;
|
|
33
|
+
* if not, write to the Free Software Foundation, Inc.,
|
|
34
|
+
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/*
|
|
38
|
+
* About MCS locks:
|
|
39
|
+
*
|
|
40
|
+
* MCS locks are queue-based locks, where the queue nodes are local to the
|
|
41
|
+
* thread. The 'lock' is nothing more than a global pointer that points to
|
|
42
|
+
* the last node in the queue, or is NULL if the queue is empty.
|
|
43
|
+
*
|
|
44
|
+
* Originally designed for use as spin locks requiring no kernel resources
|
|
45
|
+
* for synchronisation or blocking, the implementation below has adapted
|
|
46
|
+
* the MCS spin lock for use as a general mutex that will suspend threads
|
|
47
|
+
* when there is lock contention.
|
|
48
|
+
*
|
|
49
|
+
* Because the queue nodes are thread-local, most of the memory read/write
|
|
50
|
+
* operations required to add or remove nodes from the queue do not trigger
|
|
51
|
+
* cache-coherence updates.
|
|
52
|
+
*
|
|
53
|
+
* Like 'named' mutexes, MCS locks consume system resources transiently -
|
|
54
|
+
* they are able to acquire and free resources automatically - but MCS
|
|
55
|
+
* locks do not require any unique 'name' to identify the lock to all
|
|
56
|
+
* threads using it.
|
|
57
|
+
*
|
|
58
|
+
* Usage of MCS locks:
|
|
59
|
+
*
|
|
60
|
+
* - you need a global ptw32_mcs_lock_t instance initialised to 0 or NULL.
|
|
61
|
+
* - you need a local thread-scope ptw32_mcs_local_node_t instance, which
|
|
62
|
+
* may serve several different locks but you need at least one node for
|
|
63
|
+
* every lock held concurrently by a thread.
|
|
64
|
+
*
|
|
65
|
+
* E.g.:
|
|
66
|
+
*
|
|
67
|
+
* ptw32_mcs_lock_t lock1 = 0;
|
|
68
|
+
* ptw32_mcs_lock_t lock2 = 0;
|
|
69
|
+
*
|
|
70
|
+
* void *mythread(void *arg)
|
|
71
|
+
* {
|
|
72
|
+
* ptw32_mcs_local_node_t node;
|
|
73
|
+
*
|
|
74
|
+
* ptw32_mcs_acquire (&lock1, &node);
|
|
75
|
+
* ptw32_mcs_lock_release (&node);
|
|
76
|
+
*
|
|
77
|
+
* ptw32_mcs_lock_acquire (&lock2, &node);
|
|
78
|
+
* ptw32_mcs_lock_release (&node);
|
|
79
|
+
* {
|
|
80
|
+
* ptw32_mcs_local_node_t nodex;
|
|
81
|
+
*
|
|
82
|
+
* ptw32_mcs_lock_acquire (&lock1, &node);
|
|
83
|
+
* ptw32_mcs_lock_acquire (&lock2, &nodex);
|
|
84
|
+
*
|
|
85
|
+
* ptw32_mcs_lock_release (&nodex);
|
|
86
|
+
* ptw32_mcs_lock_release (&node);
|
|
87
|
+
* }
|
|
88
|
+
* return (void *)0;
|
|
89
|
+
* }
|
|
90
|
+
*/
|
|
91
|
+
|
|
92
|
+
#include "pthread.h"
|
|
93
|
+
#include "sched.h"
|
|
94
|
+
#include "implement.h"
|
|
95
|
+
|
|
96
|
+
/*
|
|
97
|
+
* ptw32_mcs_flag_set -- notify another thread about an event.
|
|
98
|
+
*
|
|
99
|
+
* Set event if an event handle has been stored in the flag, and
|
|
100
|
+
* set flag to -1 otherwise. Note that -1 cannot be a valid handle value.
|
|
101
|
+
*/
|
|
102
|
+
INLINE void
|
|
103
|
+
ptw32_mcs_flag_set (HANDLE * flag)
|
|
104
|
+
{
|
|
105
|
+
HANDLE e = (HANDLE)(PTW32_INTERLOCKED_SIZE)PTW32_INTERLOCKED_COMPARE_EXCHANGE_SIZE(
|
|
106
|
+
(PTW32_INTERLOCKED_SIZEPTR)flag,
|
|
107
|
+
(PTW32_INTERLOCKED_SIZE)-1,
|
|
108
|
+
(PTW32_INTERLOCKED_SIZE)0);
|
|
109
|
+
if ((HANDLE)0 != e)
|
|
110
|
+
{
|
|
111
|
+
/* another thread has already stored an event handle in the flag */
|
|
112
|
+
SetEvent(e);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/*
|
|
117
|
+
* ptw32_mcs_flag_set -- wait for notification from another.
|
|
118
|
+
*
|
|
119
|
+
* Store an event handle in the flag and wait on it if the flag has not been
|
|
120
|
+
* set, and proceed without creating an event otherwise.
|
|
121
|
+
*/
|
|
122
|
+
INLINE void
|
|
123
|
+
ptw32_mcs_flag_wait (HANDLE * flag)
|
|
124
|
+
{
|
|
125
|
+
if ((PTW32_INTERLOCKED_LONG)0 ==
|
|
126
|
+
PTW32_INTERLOCKED_EXCHANGE_ADD_SIZE((PTW32_INTERLOCKED_SIZEPTR)flag,
|
|
127
|
+
(PTW32_INTERLOCKED_SIZE)0)) /* MBR fence */
|
|
128
|
+
{
|
|
129
|
+
/* the flag is not set. create event. */
|
|
130
|
+
|
|
131
|
+
HANDLE e = CreateEvent(NULL, PTW32_FALSE, PTW32_FALSE, NULL);
|
|
132
|
+
|
|
133
|
+
if ((PTW32_INTERLOCKED_SIZE)0 == PTW32_INTERLOCKED_COMPARE_EXCHANGE_SIZE(
|
|
134
|
+
(PTW32_INTERLOCKED_SIZEPTR)flag,
|
|
135
|
+
(PTW32_INTERLOCKED_SIZE)e,
|
|
136
|
+
(PTW32_INTERLOCKED_SIZE)0))
|
|
137
|
+
{
|
|
138
|
+
/* stored handle in the flag. wait on it now. */
|
|
139
|
+
WaitForSingleObject(e, INFINITE);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
CloseHandle(e);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/*
|
|
147
|
+
* ptw32_mcs_lock_acquire -- acquire an MCS lock.
|
|
148
|
+
*
|
|
149
|
+
* See:
|
|
150
|
+
* J. M. Mellor-Crummey and M. L. Scott.
|
|
151
|
+
* Algorithms for Scalable Synchronization on Shared-Memory Multiprocessors.
|
|
152
|
+
* ACM Transactions on Computer Systems, 9(1):21-65, Feb. 1991.
|
|
153
|
+
*/
|
|
154
|
+
#if defined(PTW32_BUILD_INLINED)
|
|
155
|
+
INLINE
|
|
156
|
+
#endif /* PTW32_BUILD_INLINED */
|
|
157
|
+
void
|
|
158
|
+
ptw32_mcs_lock_acquire (ptw32_mcs_lock_t * lock, ptw32_mcs_local_node_t * node)
|
|
159
|
+
{
|
|
160
|
+
ptw32_mcs_local_node_t *pred;
|
|
161
|
+
|
|
162
|
+
node->lock = lock;
|
|
163
|
+
node->nextFlag = 0;
|
|
164
|
+
node->readyFlag = 0;
|
|
165
|
+
node->next = 0; /* initially, no successor */
|
|
166
|
+
|
|
167
|
+
/* queue for the lock */
|
|
168
|
+
pred = (ptw32_mcs_local_node_t *)PTW32_INTERLOCKED_EXCHANGE_PTR((PTW32_INTERLOCKED_PVOID_PTR)lock,
|
|
169
|
+
(PTW32_INTERLOCKED_PVOID)node);
|
|
170
|
+
|
|
171
|
+
if (0 != pred)
|
|
172
|
+
{
|
|
173
|
+
/* the lock was not free. link behind predecessor. */
|
|
174
|
+
pred->next = node;
|
|
175
|
+
ptw32_mcs_flag_set(&pred->nextFlag);
|
|
176
|
+
ptw32_mcs_flag_wait(&node->readyFlag);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/*
|
|
181
|
+
* ptw32_mcs_lock_release -- release an MCS lock.
|
|
182
|
+
*
|
|
183
|
+
* See:
|
|
184
|
+
* J. M. Mellor-Crummey and M. L. Scott.
|
|
185
|
+
* Algorithms for Scalable Synchronization on Shared-Memory Multiprocessors.
|
|
186
|
+
* ACM Transactions on Computer Systems, 9(1):21-65, Feb. 1991.
|
|
187
|
+
*/
|
|
188
|
+
#if defined(PTW32_BUILD_INLINED)
|
|
189
|
+
INLINE
|
|
190
|
+
#endif /* PTW32_BUILD_INLINED */
|
|
191
|
+
void
|
|
192
|
+
ptw32_mcs_lock_release (ptw32_mcs_local_node_t * node)
|
|
193
|
+
{
|
|
194
|
+
ptw32_mcs_lock_t *lock = node->lock;
|
|
195
|
+
ptw32_mcs_local_node_t *next =
|
|
196
|
+
(ptw32_mcs_local_node_t *)
|
|
197
|
+
PTW32_INTERLOCKED_EXCHANGE_ADD_SIZE((PTW32_INTERLOCKED_SIZEPTR)&node->next, (PTW32_INTERLOCKED_SIZE)0); /* MBR fence */
|
|
198
|
+
|
|
199
|
+
if (0 == next)
|
|
200
|
+
{
|
|
201
|
+
/* no known successor */
|
|
202
|
+
|
|
203
|
+
if (node == (ptw32_mcs_local_node_t *)
|
|
204
|
+
PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR((PTW32_INTERLOCKED_PVOID_PTR)lock,
|
|
205
|
+
(PTW32_INTERLOCKED_PVOID)0,
|
|
206
|
+
(PTW32_INTERLOCKED_PVOID)node))
|
|
207
|
+
{
|
|
208
|
+
/* no successor, lock is free now */
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* wait for successor */
|
|
213
|
+
ptw32_mcs_flag_wait(&node->nextFlag);
|
|
214
|
+
next = (ptw32_mcs_local_node_t *)
|
|
215
|
+
PTW32_INTERLOCKED_EXCHANGE_ADD_SIZE((PTW32_INTERLOCKED_SIZEPTR)&node->next, (PTW32_INTERLOCKED_SIZE)0); /* MBR fence */
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* pass the lock */
|
|
219
|
+
ptw32_mcs_flag_set(&next->readyFlag);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/*
|
|
223
|
+
* ptw32_mcs_lock_try_acquire
|
|
224
|
+
*/
|
|
225
|
+
#if defined(PTW32_BUILD_INLINED)
|
|
226
|
+
INLINE
|
|
227
|
+
#endif /* PTW32_BUILD_INLINED */
|
|
228
|
+
int
|
|
229
|
+
ptw32_mcs_lock_try_acquire (ptw32_mcs_lock_t * lock, ptw32_mcs_local_node_t * node)
|
|
230
|
+
{
|
|
231
|
+
node->lock = lock;
|
|
232
|
+
node->nextFlag = 0;
|
|
233
|
+
node->readyFlag = 0;
|
|
234
|
+
node->next = 0; /* initially, no successor */
|
|
235
|
+
|
|
236
|
+
return ((PTW32_INTERLOCKED_PVOID)PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR((PTW32_INTERLOCKED_PVOID_PTR)lock,
|
|
237
|
+
(PTW32_INTERLOCKED_PVOID)node,
|
|
238
|
+
(PTW32_INTERLOCKED_PVOID)0)
|
|
239
|
+
== (PTW32_INTERLOCKED_PVOID)0) ? 0 : EBUSY;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
* ptw32_mcs_node_transfer -- move an MCS lock local node, usually from thread
|
|
244
|
+
* space to, for example, global space so that another thread can release
|
|
245
|
+
* the lock on behalf of the current lock owner.
|
|
246
|
+
*
|
|
247
|
+
* Example: used in pthread_barrier_wait where we want the last thread out of
|
|
248
|
+
* the barrier to release the lock owned by the last thread to enter the barrier
|
|
249
|
+
* (the one that releases all threads but not necessarily the last to leave).
|
|
250
|
+
*
|
|
251
|
+
* Should only be called by the thread that has the lock.
|
|
252
|
+
*/
|
|
253
|
+
#if defined(PTW32_BUILD_INLINED)
|
|
254
|
+
INLINE
|
|
255
|
+
#endif /* PTW32_BUILD_INLINED */
|
|
256
|
+
void
|
|
257
|
+
ptw32_mcs_node_transfer (ptw32_mcs_local_node_t * new_node, ptw32_mcs_local_node_t * old_node)
|
|
258
|
+
{
|
|
259
|
+
new_node->lock = old_node->lock;
|
|
260
|
+
new_node->nextFlag = 0; /* Not needed - used only in initial Acquire */
|
|
261
|
+
new_node->readyFlag = 0; /* Not needed - we were waiting on this */
|
|
262
|
+
new_node->next = 0;
|
|
263
|
+
|
|
264
|
+
if ((ptw32_mcs_local_node_t *)PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR((PTW32_INTERLOCKED_PVOID_PTR)new_node->lock,
|
|
265
|
+
(PTW32_INTERLOCKED_PVOID)new_node,
|
|
266
|
+
(PTW32_INTERLOCKED_PVOID)old_node)
|
|
267
|
+
!= old_node)
|
|
268
|
+
{
|
|
269
|
+
/*
|
|
270
|
+
* A successor has queued after us, so wait for them to link to us
|
|
271
|
+
*/
|
|
272
|
+
while (old_node->next == 0)
|
|
273
|
+
{
|
|
274
|
+
sched_yield();
|
|
275
|
+
}
|
|
276
|
+
new_node->next = old_node->next;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ptw32_callUserDestroyRoutines.c
|
|
3
|
+
*
|
|
4
|
+
* Description:
|
|
5
|
+
* This translation unit implements routines which are private to
|
|
6
|
+
* the implementation and may be used throughout it.
|
|
7
|
+
*
|
|
8
|
+
* --------------------------------------------------------------------------
|
|
9
|
+
*
|
|
10
|
+
* Pthreads-win32 - POSIX Threads Library for Win32
|
|
11
|
+
* Copyright(C) 1998 John E. Bossom
|
|
12
|
+
* Copyright(C) 1999,2005 Pthreads-win32 contributors
|
|
13
|
+
*
|
|
14
|
+
* Contact Email: rpj@callisto.canberra.edu.au
|
|
15
|
+
*
|
|
16
|
+
* The current list of contributors is contained
|
|
17
|
+
* in the file CONTRIBUTORS included with the source
|
|
18
|
+
* code distribution. The list can also be seen at the
|
|
19
|
+
* following World Wide Web location:
|
|
20
|
+
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|
21
|
+
*
|
|
22
|
+
* This library is free software; you can redistribute it and/or
|
|
23
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
24
|
+
* License as published by the Free Software Foundation; either
|
|
25
|
+
* version 2 of the License, or (at your option) any later version.
|
|
26
|
+
*
|
|
27
|
+
* This library is distributed in the hope that it will be useful,
|
|
28
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
29
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
30
|
+
* Lesser General Public License for more details.
|
|
31
|
+
*
|
|
32
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
33
|
+
* License along with this library in the file COPYING.LIB;
|
|
34
|
+
* if not, write to the Free Software Foundation, Inc.,
|
|
35
|
+
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
#include "pthread.h"
|
|
39
|
+
#include "implement.h"
|
|
40
|
+
|
|
41
|
+
#if defined(__CLEANUP_CXX)
|
|
42
|
+
# if defined(_MSC_VER)
|
|
43
|
+
# include <eh.h>
|
|
44
|
+
# elif defined(__WATCOMC__)
|
|
45
|
+
# include <eh.h>
|
|
46
|
+
# include <exceptio.h>
|
|
47
|
+
# else
|
|
48
|
+
# if defined(__GNUC__) && __GNUC__ < 3
|
|
49
|
+
# include <new.h>
|
|
50
|
+
# else
|
|
51
|
+
# include <new>
|
|
52
|
+
using
|
|
53
|
+
std::terminate;
|
|
54
|
+
# endif
|
|
55
|
+
# endif
|
|
56
|
+
#endif
|
|
57
|
+
|
|
58
|
+
void
|
|
59
|
+
ptw32_callUserDestroyRoutines (pthread_t thread)
|
|
60
|
+
/*
|
|
61
|
+
* -------------------------------------------------------------------
|
|
62
|
+
* DOCPRIVATE
|
|
63
|
+
*
|
|
64
|
+
* This the routine runs through all thread keys and calls
|
|
65
|
+
* the destroy routines on the user's data for the current thread.
|
|
66
|
+
* It simulates the behaviour of POSIX Threads.
|
|
67
|
+
*
|
|
68
|
+
* PARAMETERS
|
|
69
|
+
* thread
|
|
70
|
+
* an instance of pthread_t
|
|
71
|
+
*
|
|
72
|
+
* RETURNS
|
|
73
|
+
* N/A
|
|
74
|
+
* -------------------------------------------------------------------
|
|
75
|
+
*/
|
|
76
|
+
{
|
|
77
|
+
ThreadKeyAssoc * assoc;
|
|
78
|
+
|
|
79
|
+
if (thread.p != NULL)
|
|
80
|
+
{
|
|
81
|
+
ptw32_mcs_local_node_t threadLock;
|
|
82
|
+
ptw32_mcs_local_node_t keyLock;
|
|
83
|
+
int assocsRemaining;
|
|
84
|
+
int iterations = 0;
|
|
85
|
+
ptw32_thread_t * sp = (ptw32_thread_t *) thread.p;
|
|
86
|
+
|
|
87
|
+
/*
|
|
88
|
+
* Run through all Thread<-->Key associations
|
|
89
|
+
* for the current thread.
|
|
90
|
+
*
|
|
91
|
+
* Do this process at most PTHREAD_DESTRUCTOR_ITERATIONS times.
|
|
92
|
+
*/
|
|
93
|
+
do
|
|
94
|
+
{
|
|
95
|
+
assocsRemaining = 0;
|
|
96
|
+
iterations++;
|
|
97
|
+
|
|
98
|
+
ptw32_mcs_lock_acquire(&(sp->threadLock), &threadLock);
|
|
99
|
+
/*
|
|
100
|
+
* The pointer to the next assoc is stored in the thread struct so that
|
|
101
|
+
* the assoc destructor in pthread_key_delete can adjust it
|
|
102
|
+
* if it deletes this assoc. This can happen if we fail to acquire
|
|
103
|
+
* both locks below, and are forced to release all of our locks,
|
|
104
|
+
* leaving open the opportunity for pthread_key_delete to get in
|
|
105
|
+
* before us.
|
|
106
|
+
*/
|
|
107
|
+
sp->nextAssoc = sp->keys;
|
|
108
|
+
ptw32_mcs_lock_release(&threadLock);
|
|
109
|
+
|
|
110
|
+
for (;;)
|
|
111
|
+
{
|
|
112
|
+
void * value;
|
|
113
|
+
pthread_key_t k;
|
|
114
|
+
void (*destructor) (void *);
|
|
115
|
+
|
|
116
|
+
/*
|
|
117
|
+
* First we need to serialise with pthread_key_delete by locking
|
|
118
|
+
* both assoc guards, but in the reverse order to our convention,
|
|
119
|
+
* so we must be careful to avoid deadlock.
|
|
120
|
+
*/
|
|
121
|
+
ptw32_mcs_lock_acquire(&(sp->threadLock), &threadLock);
|
|
122
|
+
|
|
123
|
+
if ((assoc = (ThreadKeyAssoc *)sp->nextAssoc) == NULL)
|
|
124
|
+
{
|
|
125
|
+
/* Finished */
|
|
126
|
+
ptw32_mcs_lock_release(&threadLock);
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
else
|
|
130
|
+
{
|
|
131
|
+
/*
|
|
132
|
+
* assoc->key must be valid because assoc can't change or be
|
|
133
|
+
* removed from our chain while we hold at least one lock. If
|
|
134
|
+
* the assoc was on our key chain then the key has not been
|
|
135
|
+
* deleted yet.
|
|
136
|
+
*
|
|
137
|
+
* Now try to acquire the second lock without deadlocking.
|
|
138
|
+
* If we fail, we need to relinquish the first lock and the
|
|
139
|
+
* processor and then try to acquire them all again.
|
|
140
|
+
*/
|
|
141
|
+
if (ptw32_mcs_lock_try_acquire(&(assoc->key->keyLock), &keyLock) == EBUSY)
|
|
142
|
+
{
|
|
143
|
+
ptw32_mcs_lock_release(&threadLock);
|
|
144
|
+
Sleep(0);
|
|
145
|
+
/*
|
|
146
|
+
* Go around again.
|
|
147
|
+
* If pthread_key_delete has removed this assoc in the meantime,
|
|
148
|
+
* sp->nextAssoc will point to a new assoc.
|
|
149
|
+
*/
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* We now hold both locks */
|
|
155
|
+
|
|
156
|
+
sp->nextAssoc = assoc->nextKey;
|
|
157
|
+
|
|
158
|
+
/*
|
|
159
|
+
* Key still active; pthread_key_delete
|
|
160
|
+
* will block on these same mutexes before
|
|
161
|
+
* it can release actual key; therefore,
|
|
162
|
+
* key is valid and we can call the destroy
|
|
163
|
+
* routine;
|
|
164
|
+
*/
|
|
165
|
+
k = assoc->key;
|
|
166
|
+
destructor = k->destructor;
|
|
167
|
+
value = TlsGetValue(k->key);
|
|
168
|
+
TlsSetValue (k->key, NULL);
|
|
169
|
+
|
|
170
|
+
// Every assoc->key exists and has a destructor
|
|
171
|
+
if (value != NULL && iterations <= PTHREAD_DESTRUCTOR_ITERATIONS)
|
|
172
|
+
{
|
|
173
|
+
/*
|
|
174
|
+
* Unlock both locks before the destructor runs.
|
|
175
|
+
* POSIX says pthread_key_delete can be run from destructors,
|
|
176
|
+
* and that probably includes with this key as target.
|
|
177
|
+
* pthread_setspecific can also be run from destructors and
|
|
178
|
+
* also needs to be able to access the assocs.
|
|
179
|
+
*/
|
|
180
|
+
ptw32_mcs_lock_release(&threadLock);
|
|
181
|
+
ptw32_mcs_lock_release(&keyLock);
|
|
182
|
+
|
|
183
|
+
assocsRemaining++;
|
|
184
|
+
|
|
185
|
+
#if defined(__cplusplus)
|
|
186
|
+
|
|
187
|
+
try
|
|
188
|
+
{
|
|
189
|
+
/*
|
|
190
|
+
* Run the caller's cleanup routine.
|
|
191
|
+
*/
|
|
192
|
+
destructor (value);
|
|
193
|
+
}
|
|
194
|
+
catch (...)
|
|
195
|
+
{
|
|
196
|
+
/*
|
|
197
|
+
* A system unexpected exception has occurred
|
|
198
|
+
* running the user's destructor.
|
|
199
|
+
* We get control back within this block in case
|
|
200
|
+
* the application has set up it's own terminate
|
|
201
|
+
* handler. Since we are leaving the thread we
|
|
202
|
+
* should not get any internal pthreads
|
|
203
|
+
* exceptions.
|
|
204
|
+
*/
|
|
205
|
+
terminate ();
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
#else /* __cplusplus */
|
|
209
|
+
|
|
210
|
+
/*
|
|
211
|
+
* Run the caller's cleanup routine.
|
|
212
|
+
*/
|
|
213
|
+
destructor (value);
|
|
214
|
+
|
|
215
|
+
#endif /* __cplusplus */
|
|
216
|
+
|
|
217
|
+
}
|
|
218
|
+
else
|
|
219
|
+
{
|
|
220
|
+
/*
|
|
221
|
+
* Remove association from both the key and thread chains
|
|
222
|
+
* and reclaim it's memory resources.
|
|
223
|
+
*/
|
|
224
|
+
ptw32_tkAssocDestroy (assoc);
|
|
225
|
+
ptw32_mcs_lock_release(&threadLock);
|
|
226
|
+
ptw32_mcs_lock_release(&keyLock);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
while (assocsRemaining);
|
|
231
|
+
}
|
|
232
|
+
} /* ptw32_callUserDestroyRoutines */
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ptw32_calloc.c
|
|
3
|
+
*
|
|
4
|
+
* Description:
|
|
5
|
+
* This translation unit implements miscellaneous thread functions.
|
|
6
|
+
*
|
|
7
|
+
* --------------------------------------------------------------------------
|
|
8
|
+
*
|
|
9
|
+
* Pthreads-win32 - POSIX Threads Library for Win32
|
|
10
|
+
* Copyright(C) 1998 John E. Bossom
|
|
11
|
+
* Copyright(C) 1999,2005 Pthreads-win32 contributors
|
|
12
|
+
*
|
|
13
|
+
* Contact Email: rpj@callisto.canberra.edu.au
|
|
14
|
+
*
|
|
15
|
+
* The current list of contributors is contained
|
|
16
|
+
* in the file CONTRIBUTORS included with the source
|
|
17
|
+
* code distribution. The list can also be seen at the
|
|
18
|
+
* following World Wide Web location:
|
|
19
|
+
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|
20
|
+
*
|
|
21
|
+
* This library is free software; you can redistribute it and/or
|
|
22
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
23
|
+
* License as published by the Free Software Foundation; either
|
|
24
|
+
* version 2 of the License, or (at your option) any later version.
|
|
25
|
+
*
|
|
26
|
+
* This library is distributed in the hope that it will be useful,
|
|
27
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
28
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
29
|
+
* Lesser General Public License for more details.
|
|
30
|
+
*
|
|
31
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
32
|
+
* License along with this library in the file COPYING.LIB;
|
|
33
|
+
* if not, write to the Free Software Foundation, Inc.,
|
|
34
|
+
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
#include "pthread.h"
|
|
38
|
+
#include "implement.h"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
#if defined(NEED_CALLOC)
|
|
42
|
+
void *
|
|
43
|
+
ptw32_calloc (size_t n, size_t s)
|
|
44
|
+
{
|
|
45
|
+
unsigned int m = n * s;
|
|
46
|
+
void *p;
|
|
47
|
+
|
|
48
|
+
p = malloc (m);
|
|
49
|
+
if (p == NULL)
|
|
50
|
+
return NULL;
|
|
51
|
+
|
|
52
|
+
memset (p, 0, m);
|
|
53
|
+
|
|
54
|
+
return p;
|
|
55
|
+
}
|
|
56
|
+
#endif
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ptw32_cond_check_need_init.c
|
|
3
|
+
*
|
|
4
|
+
* Description:
|
|
5
|
+
* This translation unit implements condition variables and their primitives.
|
|
6
|
+
*
|
|
7
|
+
*
|
|
8
|
+
* --------------------------------------------------------------------------
|
|
9
|
+
*
|
|
10
|
+
* Pthreads-win32 - POSIX Threads Library for Win32
|
|
11
|
+
* Copyright(C) 1998 John E. Bossom
|
|
12
|
+
* Copyright(C) 1999,2005 Pthreads-win32 contributors
|
|
13
|
+
*
|
|
14
|
+
* Contact Email: rpj@callisto.canberra.edu.au
|
|
15
|
+
*
|
|
16
|
+
* The current list of contributors is contained
|
|
17
|
+
* in the file CONTRIBUTORS included with the source
|
|
18
|
+
* code distribution. The list can also be seen at the
|
|
19
|
+
* following World Wide Web location:
|
|
20
|
+
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|
21
|
+
*
|
|
22
|
+
* This library is free software; you can redistribute it and/or
|
|
23
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
24
|
+
* License as published by the Free Software Foundation; either
|
|
25
|
+
* version 2 of the License, or (at your option) any later version.
|
|
26
|
+
*
|
|
27
|
+
* This library is distributed in the hope that it will be useful,
|
|
28
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
29
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
30
|
+
* Lesser General Public License for more details.
|
|
31
|
+
*
|
|
32
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
33
|
+
* License along with this library in the file COPYING.LIB;
|
|
34
|
+
* if not, write to the Free Software Foundation, Inc.,
|
|
35
|
+
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
#include "pthread.h"
|
|
39
|
+
#include "implement.h"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
int
|
|
43
|
+
ptw32_cond_check_need_init (pthread_cond_t * cond)
|
|
44
|
+
{
|
|
45
|
+
int result = 0;
|
|
46
|
+
ptw32_mcs_local_node_t node;
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* The following guarded test is specifically for statically
|
|
50
|
+
* initialised condition variables (via PTHREAD_OBJECT_INITIALIZER).
|
|
51
|
+
*/
|
|
52
|
+
ptw32_mcs_lock_acquire(&ptw32_cond_test_init_lock, &node);
|
|
53
|
+
|
|
54
|
+
/*
|
|
55
|
+
* We got here possibly under race
|
|
56
|
+
* conditions. Check again inside the critical section.
|
|
57
|
+
* If a static cv has been destroyed, the application can
|
|
58
|
+
* re-initialise it only by calling pthread_cond_init()
|
|
59
|
+
* explicitly.
|
|
60
|
+
*/
|
|
61
|
+
if (*cond == PTHREAD_COND_INITIALIZER)
|
|
62
|
+
{
|
|
63
|
+
result = pthread_cond_init (cond, NULL);
|
|
64
|
+
}
|
|
65
|
+
else if (*cond == NULL)
|
|
66
|
+
{
|
|
67
|
+
/*
|
|
68
|
+
* The cv has been destroyed while we were waiting to
|
|
69
|
+
* initialise it, so the operation that caused the
|
|
70
|
+
* auto-initialisation should fail.
|
|
71
|
+
*/
|
|
72
|
+
result = EINVAL;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
ptw32_mcs_lock_release(&node);
|
|
76
|
+
|
|
77
|
+
return result;
|
|
78
|
+
}
|