diff options
Diffstat (limited to 'task/task-id.c')
-rw-r--r-- | task/task-id.c | 121 |
1 files changed, 0 insertions, 121 deletions
diff --git a/task/task-id.c b/task/task-id.c deleted file mode 100644 index ec51d05..0000000 --- a/task/task-id.c +++ /dev/null @@ -1,121 +0,0 @@ -/* task-id.c - Manage task IDs. - Copyright (C) 2004 Free Software Foundation, Inc. - Written by Marcus Brinkmann. - - This file is part of the GNU Hurd. - - The GNU Hurd is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2, or (at - your option) any later version. - - The GNU Hurd is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#if HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stddef.h> - -#include "task.h" - - -/* The hash table mapping task IDs to tasks. */ -struct hurd_ihash task_id_to_task - = HURD_IHASH_INITIALIZER (offsetof (struct task, locp)); - -/* The lock protecting the task_it_to_task hash table and associated - data. */ -pthread_mutex_t task_id_to_task_lock = PTHREAD_MUTEX_INITIALIZER; - -#define task_id_is_free(task_id) \ - (hurd_ihash_find (&task_id_to_task, (task_id)) == NULL) - - -/* Enter the task TASK under its ID into the hash table, consuming one - reference. Mainly used by the bootstrap functions. */ -error_t -task_id_enter (task_t task) -{ - error_t err; - - pthread_mutex_lock (&task_id_to_task_lock); - err = hurd_ihash_add (&task_id_to_task, task->task_id, task); - pthread_mutex_unlock (&task_id_to_task_lock); - - return err; -} - - -/* Increment the task_id_next marker. */ -static inline hurd_task_id_t -task_id_inc (hurd_task_id_t task_id) -{ - /* We know that either the next task ID or the one after it is - valid. So we manually unroll the loop here. */ - - task_id++; - if (! L4_THREAD_VERSION_VALID (task_id)) - task_id++; - - return task_id; -} - - -/* Find a free task ID, enter the task TASK into the hash table under - this ID, consuming one reference, and return the new task ID. If - no free task ID is available, EAGAIN is returned. */ -error_t -task_id_add (task_t task, hurd_task_id_t *task_id_p) -{ - /* Zero is an invalid task ID. But last_task_id will be incremented - to the next valid task ID before the first allocation takes - place. This variable is protected by task_id_to_task_lock. */ - static hurd_task_id_t last_task_id; - error_t err = 0; - hurd_task_id_t task_id; - - pthread_mutex_lock (&task_id_to_task_lock); - - /* Find next valid task ID. */ - task_id = task_id_inc (last_task_id); - - if (__builtin_expect (! task_id_is_free (task_id), 0)) - { - /* Slow path. The next task ID is taken. Skip forward until we - find a free one. */ - - /* The first task ID we tried. */ - hurd_task_id_t first_task_id = task_id; - - do - task_id = task_id_inc (task_id); - while (task_id != first_task_id && !task_id_is_free (task_id)); - - /* Check if we wrapped over and ended up where we started. */ - if (task_id == first_task_id) - err = EAGAIN; - } - - if (__builtin_expect (!err, 1)) - { - err = hurd_ihash_add (&task_id_to_task, task_id, task); - if (__builtin_expect (!err, 1)) - { - task->task_id = task_id; - *task_id_p = task_id; - last_task_id = task_id; - } - } - - pthread_mutex_unlock (&task_id_to_task_lock); - - return err; -} |