diff options
Diffstat (limited to 'src/library.js')
-rw-r--r-- | src/library.js | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/src/library.js b/src/library.js index 9e78db13..3ba2f56b 100644 --- a/src/library.js +++ b/src/library.js @@ -6808,24 +6808,38 @@ LibraryManager.library = { _pthread_once.seen[ptr] = 1; }, + $PTHREAD_SPECIFIC: {}, + $PTHREAD_SPECIFIC_NEXT_KEY: 1, + pthread_key_create__deps: ['$PTHREAD_SPECIFIC', '$PTHREAD_SPECIFIC_NEXT_KEY', '$ERRNO_CODES'], pthread_key_create: function(key, destructor) { - if (!_pthread_key_create.keys) _pthread_key_create.keys = {}; + if (key == 0) { + return ERRNO_CODES.EINVAL; + } + {{{ makeSetValue('key', '0', 'PTHREAD_SPECIFIC_NEXT_KEY', 'i32*') }}} // values start at 0 - _pthread_key_create.keys[key] = 0; + PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY] = 0; + PTHREAD_SPECIFIC_NEXT_KEY++; + return 0; }, + pthread_getspecific__deps: ['$PTHREAD_SPECIFIC'], pthread_getspecific: function(key) { - return _pthread_key_create.keys[key] || 0; + return PTHREAD_SPECIFIC[key] || 0; }, + pthread_setspecific__deps: ['$PTHREAD_SPECIFIC', '$ERRNO_CODES'], pthread_setspecific: function(key, value) { - _pthread_key_create.keys[key] = value; + if (value == 0) { + return ERRNO_CODES.EINVAL; + } + PTHREAD_SPECIFIC[key] = value; + return 0; }, - pthread_key_delete: ['$ERRNO_CODES'], + pthread_key_delete__deps: ['$PTHREAD_SPECIFIC', '$ERRNO_CODES'], pthread_key_delete: function(key) { - if (_pthread_key_create.keys[key]) { - delete _pthread_key_create.keys[key]; + if (key in PTHREAD_SPECIFIC) { + delete PTHREAD_SPECIFIC[key]; return 0; } return ERRNO_CODES.EINVAL; |