Annotation of XNU/osfmk/kern/bsd_kern.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: #include <mach/mach_types.h>
                     23: #include <kern/queue.h>
                     24: #include <kern/ast.h>
                     25: #include <kern/thread.h>
                     26: #include <kern/task.h>
                     27: #include <kern/spl.h>
                     28: #include <kern/lock.h>
                     29: #include <vm/vm_map.h>
                     30: #include <vm/pmap.h>
                     31: #include <ipc/ipc_port.h>
                     32: #include <ipc/ipc_object.h>
                     33: 
                     34: #undef clear_wait
                     35: #undef act_deallocate
                     36: #undef act_reference
                     37: #undef thread_should_halt
                     38: #undef ipc_port_release
                     39: #undef thread_ast_set
                     40: 
                     41: decl_simple_lock_data(extern,reaper_lock)
                     42: extern queue_head_t           reaper_queue;
                     43: 
                     44: /* BSD KERN COMPONENT INTERFACE */
                     45: 
                     46: thread_act_t get_firstthread(task_t);
                     47: vm_map_t  get_task_map(task_t);
                     48: ipc_space_t  get_task_ipcspace(task_t);
                     49: boolean_t is_kerneltask(task_t);
                     50: boolean_t is_thread_idle(thread_t);
                     51: boolean_t is_thread_running(thread_t);
                     52: thread_shuttle_t getshuttle_thread( thread_act_t);
                     53: thread_act_t getact_thread( thread_shuttle_t);
                     54: vm_offset_t get_map_min( vm_map_t);
                     55: vm_offset_t get_map_max( vm_map_t);
                     56: void act_reference( thread_act_t);
                     57: void act_deallocate( thread_act_t);
                     58: int get_task_userstop(task_t);
                     59: int get_thread_userstop(thread_act_t);
                     60: int inc_task_userstop(task_t);
                     61: boolean_t thread_should_abort(thread_shuttle_t);
                     62: void task_act_iterate_wth_args(task_t, void(*)(thread_act_t, void *), void *);
                     63: void ipc_port_release(ipc_port_t);
                     64: void thread_ast_set(thread_act_t, ast_t);
                     65: boolean_t is_thread_active(thread_t);
                     66: event_t get_thread_waitevent(thread_t);
                     67: kern_return_t get_thread_waitresult(thread_t);
                     68: vm_size_t get_vmmap_size(vm_map_t);
                     69: int get_vmmap_entries(vm_map_t);
                     70: int  get_task_numacts(task_t);
                     71: 
                     72: 
                     73: 
                     74: /*
                     75:  *
                     76:  */
                     77: void  *get_bsdtask_info(task_t t)
                     78: {
                     79:        return(t->bsd_info);
                     80: }
                     81: 
                     82: /*
                     83:  *
                     84:  */
                     85: void set_bsdtask_info(task_t t,void * v)
                     86: {
                     87:        t->bsd_info=v;
                     88: }
                     89: 
                     90: /*
                     91:  *
                     92:  */
                     93: void *get_bsdthread_info(thread_act_t th)
                     94: {
                     95:        return(&th->bsd_space[0]);
                     96: }
                     97: 
                     98: /*
                     99:  *
                    100:  */
                    101: thread_act_t get_firstthread(task_t task)
                    102: {
                    103:        return((thread_act_t)queue_first(&task->thr_acts));
                    104: }
                    105: 
                    106: /*
                    107:  *
                    108:  */
                    109: vm_map_t  get_task_map(task_t t)
                    110: {
                    111:        return(t->map);
                    112: }
                    113: 
                    114: /*
                    115:  *
                    116:  */
                    117: ipc_space_t  get_task_ipcspace(task_t t)
                    118: {
                    119:        return(t->itk_space);
                    120: }
                    121: 
                    122: int  get_task_numacts(task_t t)
                    123: {
                    124:        return(t->thr_act_count);
                    125: }
                    126: 
                    127: /*
                    128:  *
                    129:  */
                    130: void set_task_map(task_t t,vm_map_t map)
                    131: {
                    132:        t->map = map;
                    133: }
                    134: 
                    135: /*
                    136:  *
                    137:  */
                    138: void set_act_map(thread_act_t t,vm_map_t map)
                    139: {
                    140:        t->map = map;
                    141: }
                    142: 
                    143: /*
                    144:  *
                    145:  */
                    146: pmap_t  get_task_pmap(task_t t)
                    147: {
                    148:        return(t->map->pmap);
                    149: }
                    150: 
                    151: /*
                    152:  *
                    153:  */
                    154: pmap_t  get_map_pmap(vm_map_t map)
                    155: {
                    156:        return(map->pmap);
                    157: }
                    158: /*
                    159:  *
                    160:  */
                    161: task_t get_threadtask(thread_act_t th)
                    162: {
                    163:        return(th->task);
                    164: }
                    165: 
                    166: 
                    167: /*
                    168:  *
                    169:  */
                    170: boolean_t is_thread_idle(thread_t th)
                    171: {
                    172:        return(th->state & TH_IDLE == TH_IDLE);
                    173: }
                    174: 
                    175: /*
                    176:  *
                    177:  */
                    178: boolean_t is_thread_running(thread_t th)
                    179: {
                    180:        return(th->state & TH_RUN == TH_RUN);
                    181: }
                    182: 
                    183: /*
                    184:  *
                    185:  */
                    186: thread_shuttle_t
                    187: getshuttle_thread(
                    188:        thread_act_t    th)
                    189: {
                    190: #ifdef DEBUG
                    191:        assert(th->thread);
                    192: #endif
                    193:        return(th->thread);
                    194: }
                    195: 
                    196: /*
                    197:  *
                    198:  */
                    199: thread_act_t
                    200: getact_thread(
                    201:        thread_shuttle_t        th)
                    202: {
                    203: #ifdef DEBUG
                    204:        assert(th->top_act);
                    205: #endif
                    206:        return(th->top_act);
                    207: }
                    208: 
                    209: /*
                    210:  *
                    211:  */
                    212: vm_offset_t
                    213: get_map_min(
                    214:        vm_map_t        map)
                    215: {
                    216:        return(vm_map_min(map));
                    217: }
                    218: 
                    219: /*
                    220:  *
                    221:  */
                    222: vm_offset_t
                    223: get_map_max(
                    224:        vm_map_t        map)
                    225: {
                    226:        return(vm_map_max(map));
                    227: }
                    228: vm_size_t
                    229: get_vmmap_size(
                    230:        vm_map_t        map)
                    231: {
                    232:        return(map->size);
                    233: }
                    234: int
                    235: get_vmmap_entries(
                    236:        vm_map_t        map)
                    237: {
                    238:        return(map->hdr.nentries);
                    239: }
                    240: 
                    241: /*
                    242:  *
                    243:  */
                    244: void
                    245: act_reference(
                    246:        thread_act_t thr_act)
                    247: {
                    248:        if (thr_act) {
                    249:                act_lock(thr_act);
                    250:                assert((thr_act)->ref_count < ACT_MAX_REFERENCES);
                    251:                if ((thr_act)->ref_count <= 0)
                    252:                        panic("act_reference: already freed");
                    253:                (thr_act)->ref_count++;
                    254:                act_unlock(thr_act);
                    255:        }
                    256: }
                    257: 
                    258: /*
                    259:  *
                    260:  */
                    261: void
                    262: act_deallocate(
                    263:        thread_act_t thr_act) 
                    264: {
                    265:        if (thr_act) {
                    266:                int new_value;
                    267:                act_lock(thr_act);
                    268:                assert((thr_act)->ref_count > 0 &&
                    269:                (thr_act)->ref_count <= ACT_MAX_REFERENCES);
                    270:                new_value = --(thr_act)->ref_count;
                    271:                if (new_value == 0)
                    272:                        { act_free(thr_act); }
                    273:                else 
                    274:                        act_unlock(thr_act);
                    275:        } 
                    276: }
                    277: 
                    278: /*
                    279:  *
                    280:  */
                    281: int
                    282: get_task_userstop(
                    283:        task_t task)
                    284: {
                    285:        return(task->user_stop_count);
                    286: }
                    287: 
                    288: /*
                    289:  *
                    290:  */
                    291: int
                    292: get_thread_userstop(
                    293:        thread_act_t th)
                    294: {
                    295:        return(th->user_stop_count);
                    296: }
                    297: 
                    298: /*
                    299:  *
                    300:  */
                    301: int
                    302: inc_task_userstop(
                    303:        task_t  task)
                    304: {
                    305:        int i=0;
                    306:        i = task->user_stop_count;
                    307:        task->user_stop_count++;
                    308:        return(i);
                    309: }
                    310: 
                    311: 
                    312: /*
                    313:  *
                    314:  */
                    315: boolean_t
                    316: thread_should_abort(
                    317:        thread_shuttle_t th)
                    318: {
                    319:        return( (!th->top_act || !th->top_act->active || 
                    320:         th->state & TH_ABORT)); 
                    321: }
                    322: /*
                    323:  *
                    324:  */
                    325: void
                    326: task_act_iterate_wth_args(
                    327:        task_t task,
                    328:        void (*func_callback)(thread_act_t, void *),
                    329:        void *func_arg)
                    330: {
                    331:         thread_act_t inc, ninc;
                    332: 
                    333:         for (inc  = (thread_act_t)queue_first(&task->thr_acts);
                    334:              inc != (thread_act_t)&task->thr_acts;
                    335:              inc  = ninc) {
                    336:                 ninc = (thread_act_t)queue_next(&inc->thr_acts);
                    337:                 (void) (*func_callback)(inc, func_arg);
                    338:         }
                    339: 
                    340: }
                    341: 
                    342: void
                    343: ipc_port_release(
                    344:        ipc_port_t port)
                    345: {
                    346:        ipc_object_release(&(port)->ip_object);
                    347: }
                    348: 
                    349: void
                    350: thread_ast_set(
                    351:        thread_act_t act, 
                    352:        ast_t reason) 
                    353: {
                    354:           act->ast |= reason;
                    355: }
                    356: 
                    357: boolean_t
                    358: is_thread_active(
                    359:        thread_shuttle_t th)
                    360: {
                    361:        return(th->active);
                    362: }
                    363: 
                    364: event_t
                    365: get_thread_waitevent(
                    366:        thread_shuttle_t th)
                    367: {
                    368:        return(th->wait_event);
                    369: }
                    370: 
                    371: kern_return_t
                    372: get_thread_waitresult(
                    373:        thread_shuttle_t th)
                    374: {
                    375:        return(th->wait_result);
                    376: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.