Changeset 106 for pjproject/trunk/pjlib/src/pj/os_core_win32.c
- Timestamp:
- Dec 30, 2005 11:50:15 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjlib/src/pj/os_core_win32.c
r70 r106 860 860 861 861 /////////////////////////////////////////////////////////////////////////////// 862 863 struct pj_rwmutex_t 864 { 865 pj_mutex_t *read_lock, *write_lock; 866 int reader_count; 867 }; 868 869 /* 870 * Create reader/writer mutex. 871 * 872 */ 873 PJ_DEF(pj_status_t) pj_rwmutex_create(pj_pool_t *pool, const char *name, 874 pj_rwmutex_t **p_mutex) 875 { 876 pj_status_t status; 877 pj_rwmutex_t *rwmutex; 878 879 PJ_ASSERT_RETURN(pool && p_mutex, PJ_EINVAL); 880 881 *p_mutex = NULL; 882 rwmutex = pj_pool_alloc(pool, sizeof(struct pj_rwmutex_t)); 883 884 status = pj_mutex_create_simple(pool, name, &rwmutex ->read_lock); 885 if (status != PJ_SUCCESS) 886 return status; 887 888 status = pj_mutex_create_recursive(pool, name, &rwmutex->write_lock); 889 if (status != PJ_SUCCESS) { 890 pj_mutex_destroy(rwmutex->read_lock); 891 return status; 892 } 893 894 rwmutex->reader_count = 0; 895 *p_mutex = rwmutex; 896 return PJ_SUCCESS; 897 } 898 899 /* 900 * Lock the mutex for reading. 901 * 902 */ 903 PJ_DEF(pj_status_t) pj_rwmutex_lock_read(pj_rwmutex_t *mutex) 904 { 905 pj_status_t status; 906 907 PJ_ASSERT_RETURN(mutex, PJ_EINVAL); 908 909 status = pj_mutex_lock(mutex->read_lock); 910 if (status != PJ_SUCCESS) 911 return status; 912 913 mutex->reader_count++; 914 if (mutex->reader_count == 1) 915 pj_mutex_lock(mutex->write_lock); 916 917 status = pj_mutex_unlock(mutex->read_lock); 918 return status; 919 } 920 921 /* 922 * Lock the mutex for writing. 923 * 924 */ 925 PJ_DEF(pj_status_t) pj_rwmutex_lock_write(pj_rwmutex_t *mutex) 926 { 927 PJ_ASSERT_RETURN(mutex, PJ_EINVAL); 928 return pj_mutex_lock(mutex->write_lock); 929 } 930 931 /* 932 * Release read lock. 933 * 934 */ 935 PJ_DEF(pj_status_t) pj_rwmutex_unlock_read(pj_rwmutex_t *mutex) 936 { 937 pj_status_t status; 938 939 PJ_ASSERT_RETURN(mutex, PJ_EINVAL); 940 941 status = pj_mutex_lock(mutex->read_lock); 942 if (status != PJ_SUCCESS) 943 return status; 944 945 pj_assert(mutex->reader_count >= 1); 946 947 --mutex->reader_count; 948 if (mutex->reader_count == 0) 949 pj_mutex_unlock(mutex->write_lock); 950 951 status = pj_mutex_unlock(mutex->read_lock); 952 return status; 953 } 954 955 /* 956 * Release write lock. 957 * 958 */ 959 PJ_DEF(pj_status_t) pj_rwmutex_unlock_write(pj_rwmutex_t *mutex) 960 { 961 PJ_ASSERT_RETURN(mutex, PJ_EINVAL); 962 return pj_mutex_unlock(mutex->write_lock); 963 } 964 965 966 /* 967 * Destroy reader/writer mutex. 968 * 969 */ 970 PJ_DEF(pj_status_t) pj_rwmutex_destroy(pj_rwmutex_t *mutex) 971 { 972 PJ_ASSERT_RETURN(mutex, PJ_EINVAL); 973 pj_mutex_destroy(mutex->read_lock); 974 pj_mutex_destroy(mutex->write_lock); 975 return PJ_SUCCESS; 976 } 977 978 /////////////////////////////////////////////////////////////////////////////// 862 979 /* 863 980 * pj_enter_critical_section()
Note: See TracChangeset
for help on using the changeset viewer.