Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/ipc/kbox.c

    r48bcf49 rb7fd2a0  
    206206 * cleanup code.
    207207 *
    208  * @return Phone capability handle on success, or negative error code.
    209  *
    210  */
    211 int ipc_connect_kbox(task_id_t taskid)
     208 * @param[out] out_phone  Phone capability handle on success.
     209 * @return Error code.
     210 *
     211 */
     212errno_t ipc_connect_kbox(task_id_t taskid, cap_handle_t *out_phone)
    212213{
    213214        irq_spinlock_lock(&tasks_lock, true);
     
    231232        }
    232233       
    233         if (task->kb.finished != false) {
     234        if (task->kb.finished) {
    234235                mutex_unlock(&task->kb.cleanup_lock);
    235236                return EINVAL;
    236237        }
    237238       
    238         cap_handle_t phone_handle = phone_alloc(TASK);
    239         if (phone_handle < 0) {
     239        /* Create a kbox thread if necessary. */
     240        if (task->kb.thread == NULL) {
     241                thread_t *kb_thread = thread_create(kbox_thread_proc, NULL, task,
     242                    THREAD_FLAG_NONE, "kbox");
     243               
     244                if (!kb_thread) {
     245                        mutex_unlock(&task->kb.cleanup_lock);
     246                        return ENOMEM;
     247                }
     248               
     249                task->kb.thread = kb_thread;
     250                thread_ready(kb_thread);
     251        }
     252       
     253        /* Allocate a new phone. */
     254        cap_handle_t phone_handle;
     255        errno_t rc = phone_alloc(TASK, &phone_handle);
     256        if (rc != EOK) {
    240257                mutex_unlock(&task->kb.cleanup_lock);
    241                 return phone_handle;
     258                return rc;
    242259        }
    243260       
     
    248265        (void) ipc_phone_connect(phone_obj->phone, &task->kb.box);
    249266       
    250         if (task->kb.thread != NULL) {
    251                 mutex_unlock(&task->kb.cleanup_lock);
    252                 return phone_handle;
    253         }
    254        
    255         /* Create a kbox thread */
    256         thread_t *kb_thread = thread_create(kbox_thread_proc, NULL, task,
    257             THREAD_FLAG_NONE, "kbox");
    258         if (!kb_thread) {
    259                 mutex_unlock(&task->kb.cleanup_lock);
    260                 return ENOMEM;
    261         }
    262        
    263         task->kb.thread = kb_thread;
    264         thread_ready(kb_thread);
    265        
    266267        mutex_unlock(&task->kb.cleanup_lock);
    267        
    268         return phone_handle;
     268        *out_phone = phone_handle;
     269        return EOK;
    269270}
    270271
Note: See TracChangeset for help on using the changeset viewer.