Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset e7ac23d in mainline


Ignore:
Timestamp:
2017-08-20T14:53:21Z (3 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
master
Children:
3f74275
Parents:
49115ac
Message:

Hide kobject implementation details

Location:
kernel/generic
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/kobject/kobject.h

    r49115ac re7ac23d  
    4242#define MAX_KERNEL_OBJECTS  64
    4343
     44#define for_each_kobject(task, ko, type) \
     45        for (int i = 0, l = 1; i < MAX_KERNEL_OBJECTS && l; i++) \
     46                for (kobject_t *(ko) = kobject_get((task), i, (type)); \
     47                    (ko) && !(l = 0); (ko) = NULL, l = 1)
     48
     49#define for_each_kobject_current(ko, type) \
     50        for_each_kobject(TASK, (ko), (type))
     51
    4452typedef enum {
    4553        KOBJECT_TYPE_INVALID,
     
    6169struct task;
    6270
     71void kobject_task_alloc(struct task *);
     72void kobject_task_free(struct task *);
     73void kobject_task_init(struct task *);
     74
    6375extern void kobject_initialize(kobject_t *);
    6476extern kobject_t *kobject_get(struct task *, int, kobject_type_t);
     
    6779extern void kobject_free(struct task *, int);
    6880
     81extern int kobject_to_cap(struct task *, kobject_t *);
     82
    6983#endif
    7084
  • kernel/generic/src/ipc/ipc.c

    r49115ac re7ac23d  
    735735{
    736736        call_t *call;
    737         size_t i;
     737        bool all_clean;
    738738
    739739restart:
     
    742742         * Locking is needed as there may be connection handshakes in progress.
    743743         */
    744         for (i = 0; i < MAX_KERNEL_OBJECTS; i++) {
    745                 phone_t *phone = phone_get_current(i);
    746                 if (!phone)
    747                         continue;
     744        all_clean = true;
     745        for_each_kobject_current(kobj, KOBJECT_TYPE_PHONE) {
     746                phone_t *phone = &kobj->phone;
    748747
    749748                mutex_lock(&phone->lock);
     
    781780                if (phone->state != IPC_PHONE_FREE) {
    782781                        mutex_unlock(&phone->lock);
     782                        all_clean = false;
    783783                        break;
    784784                }
     
    788788               
    789789        /* Got into cleanup */
    790         if (i == MAX_KERNEL_OBJECTS)
     790        if (all_clean)
    791791                return;
    792792               
     
    820820
    821821        /* Disconnect all our phones ('ipc_phone_hangup') */
    822         for (int i = 0; i < MAX_KERNEL_OBJECTS; i++) {
    823                 phone_t *phone = phone_get_current(i);
    824                 if (!phone)
    825                         continue;
     822        for_each_kobject_current(kobj, KOBJECT_TYPE_PHONE) {
     823                phone_t *phone = &kobj->phone;
    826824                ipc_phone_hangup(phone);
    827825        }
     
    913911        printf("[phone cap] [calls] [state\n");
    914912       
    915         size_t i;
    916         for (i = 0; i < MAX_KERNEL_OBJECTS; i++) {
    917                 phone_t *phone = phone_get(task, i);
    918                 if (!phone)
     913        for_each_kobject(task, kobj, KOBJECT_TYPE_PHONE) {
     914                phone_t *phone = &kobj->phone;
     915                int cap = kobject_to_cap(task, kobj);
     916
     917                if (SYNCH_FAILED(mutex_trylock(&phone->lock))) {
     918                        printf("%-11d (mutex busy)\n", cap);
    919919                        continue;
    920 
    921                 if (SYNCH_FAILED(mutex_trylock(&phone->lock))) {
    922                         printf("%-10zu (mutex busy)\n", i);
    923                         continue;
    924920                }
    925921               
    926922                if (phone->state != IPC_PHONE_FREE) {
    927                         printf("%-11zu %7" PRIun " ", i,
     923                        printf("%-11d %7" PRIun " ", cap,
    928924                            atomic_get(&phone->active_calls));
    929925                       
  • kernel/generic/src/kobject/kobject.c

    r49115ac re7ac23d  
    3737#include <synch/spinlock.h>
    3838#include <abi/errno.h>
     39#include <mm/slab.h>
    3940
    4041void kobject_initialize(kobject_t *kobj)
     
    4243        kobj->type = KOBJECT_TYPE_INVALID;
    4344        kobj->can_reclaim = NULL;
     45}
     46
     47void kobject_task_alloc(task_t *task)
     48{
     49        task->kobject = malloc(sizeof(kobject_t) * MAX_KERNEL_OBJECTS, 0);
     50}
     51
     52void kobject_task_init(task_t *task)
     53{
     54        for (int cap = 0; cap < MAX_KERNEL_OBJECTS; cap++)
     55                kobject_initialize(&task->kobject[cap]);
     56}
     57
     58void kobject_task_free(task_t *task)
     59{
     60        free(task->kobject);
    4461}
    4562
     
    91108}
    92109
     110int kobject_to_cap(task_t *task, kobject_t *kobj)
     111{
     112        return kobj - task->kobject;
     113}
     114
    93115/** @}
    94116 */
  • kernel/generic/src/proc/task.c

    r49115ac re7ac23d  
    168168       
    169169        list_initialize(&task->threads);
    170 
    171         task->kobject = malloc(sizeof(kobject_t) * MAX_KERNEL_OBJECTS, 0);
     170       
     171        kobject_task_alloc(task);
    172172       
    173173        ipc_answerbox_init(&task->answerbox, task);
     
    190190        task_t *task = (task_t *) obj;
    191191       
    192         free(task->kobject);
     192        kobject_task_free(task);
    193193        return 0;
    194194}
     
    215215        task->kcycles = 0;
    216216
    217         int cap;
    218         for (cap = 0; cap < MAX_KERNEL_OBJECTS; cap++)
    219                 kobject_initialize(&task->kobject[cap]);
     217        kobject_task_init(task);
    220218
    221219        task->ipc_info.call_sent = 0;
     
    626624       
    627625        if (*additional) {
    628                 int i;
    629                 for (i = 0; i < MAX_KERNEL_OBJECTS; i++) {
    630                         phone_t *phone = phone_get(task, i);
    631                         if (phone && phone->callee)
    632                                 printf(" %d:%p", i, phone->callee);
     626                for_each_kobject(task, ko, KOBJECT_TYPE_PHONE) {
     627                        phone_t *phone = &ko->phone;
     628                        if (phone->callee)
     629                                printf(" %d:%p", kobject_to_cap(task, ko),
     630                                    phone->callee);
    633631                }
    634632                printf("\n");
Note: See TracChangeset for help on using the changeset viewer.