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

Changeset 4d11204 in mainline


Ignore:
Timestamp:
2015-06-06T14:41:16Z (5 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
master
Children:
0453261, 048cd69
Parents:
87a2f9b
Message:

Protect accesses to fibril_list by fibril_futex.

Location:
uspace/lib/c
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/fibril.c

    r87a2f9b r4d11204  
    5757/**
    5858 * This futex serializes access to ready_list,
    59  * serialized_list and manager_list.
     59 * serialized_list, manager_list and fibril_list.
    6060 */
    6161static futex_t fibril_futex = FUTEX_INITIALIZER;
     
    126126       
    127127        fibril->waits_for = NULL;
     128
     129        futex_lock(&fibril_futex);
    128130        list_append(&fibril->all_link, &fibril_list);
     131        futex_unlock(&fibril_futex);
    129132       
    130133        return fibril;
    131134}
    132135
    133 void fibril_teardown(fibril_t *fibril)
    134 {
     136void fibril_teardown(fibril_t *fibril, bool locked)
     137{       
     138        if (!locked)
     139                futex_lock(&fibril_futex);
    135140        list_remove(&fibril->all_link);
     141        if (!locked)
     142                futex_unlock(&fibril_futex);
    136143        tls_free(fibril->tcb);
    137144        free(fibril);
     
    208215                                        as_area_destroy(stack);
    209216                                }
    210                                 fibril_teardown(srcf->clean_after_me);
     217                                fibril_teardown(srcf->clean_after_me, true);
    211218                                srcf->clean_after_me = NULL;
    212219                        }
     
    294301            AS_AREA_LATE_RESERVE);
    295302        if (fibril->stack == (void *) -1) {
    296                 fibril_teardown(fibril);
     303                fibril_teardown(fibril, false);
    297304                return 0;
    298305        }
     
    321328       
    322329        as_area_destroy(fibril->stack);
    323         fibril_teardown(fibril);
     330        fibril_teardown(fibril, false);
    324331}
    325332
  • uspace/lib/c/generic/libc.c

    r87a2f9b r4d11204  
    122122                __stdio_done();
    123123                task_retval(status);
    124                 fibril_teardown(__tcb_get()->fibril_data);
     124                fibril_teardown(__tcb_get()->fibril_data, false);
    125125        }
    126126       
  • uspace/lib/c/generic/thread.c

    r87a2f9b r4d11204  
    8888#endif
    8989       
    90         fibril_teardown(fibril);
     90        fibril_teardown(fibril, false);
    9191       
    9292        thread_exit(0);
  • uspace/lib/c/include/fibril.h

    r87a2f9b r4d11204  
    9494extern void fibril_destroy(fid_t fid);
    9595extern fibril_t *fibril_setup(void);
    96 extern void fibril_teardown(fibril_t *f);
     96extern void fibril_teardown(fibril_t *f, bool locked);
    9797extern int fibril_switch(fibril_switch_type_t stype);
    9898extern void fibril_add_ready(fid_t fid);
Note: See TracChangeset for help on using the changeset viewer.