refptr.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifdef HAVE_CONFIG_H
00030 # include <config.h>
00031 #endif
00032
00033 #include "refptr_p.h"
00034 #include <gwenhywfar/misc.h>
00035 #include <gwenhywfar/debug.h>
00036 #include <stdlib.h>
00037
00038
00039
00040 GWEN_REFPTR_POBJECT *GWEN_RefPtrObject_new(void *dp, GWEN_REFPTR_INFO *rpi){
00041 GWEN_REFPTR_POBJECT *rpo;
00042
00043 GWEN_NEW_OBJECT(GWEN_REFPTR_POBJECT, rpo);
00044 rpo->refCount=1;
00045 rpo->ptr=dp;
00046 rpo->infoPtr=rpi;
00047 if (rpi)
00048 GWEN_RefPtrInfo_Attach(rpi);
00049 return rpo;
00050 }
00051
00052
00053
00054 void GWEN_RefPtrObject_free(GWEN_REFPTR_POBJECT *rpo){
00055 if (rpo) {
00056 assert(rpo->refCount);
00057 if (--(rpo->refCount)==0) {
00058 DBG_VERBOUS(GWEN_LOGDOMAIN, "Freeing GWEN_RefPtrObject");
00059 if ((rpo->flags & GWEN_REFPTR_FLAGS_AUTODELETE) &&
00060 rpo->infoPtr &&
00061 rpo->ptr) {
00062 if (rpo->infoPtr->freeFn)
00063 rpo->infoPtr->freeFn(rpo->ptr);
00064 }
00065 GWEN_FREE_OBJECT(rpo);
00066 }
00067 }
00068 }
00069
00070
00071
00072 void GWEN_RefPtrObject_Attach(GWEN_REFPTR_POBJECT *rpo){
00073 assert(rpo);
00074 assert(rpo->refCount);
00075 rpo->refCount++;
00076 }
00077
00078
00079
00080 uint32_t GWEN_RefPtrInfo_GetFlags(const GWEN_REFPTR_INFO *rpi){
00081 assert(rpi);
00082 return rpi->flags;
00083 }
00084
00085
00086
00087 void GWEN_RefPtrInfo_SetFlags(GWEN_REFPTR_INFO *rpi, uint32_t fl){
00088 assert(rpi);
00089 rpi->flags=fl;
00090 }
00091
00092
00093
00094 void GWEN_RefPtrInfo_AddFlags(GWEN_REFPTR_INFO *rpi, uint32_t fl){
00095 assert(rpi);
00096 rpi->flags|=fl;
00097 }
00098
00099
00100
00101 void GWEN_RefPtrInfo_DelFlags(GWEN_REFPTR_INFO *rpi, uint32_t fl){
00102 assert(rpi);
00103 rpi->flags&=~fl;
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 GWEN_REFPTR_INFO *GWEN_RefPtrInfo_new(){
00116 GWEN_REFPTR_INFO *rpi;
00117
00118 GWEN_NEW_OBJECT(GWEN_REFPTR_INFO, rpi);
00119 rpi->refCount=1;
00120
00121 return rpi;
00122 }
00123
00124
00125
00126 void GWEN_RefPtrInfo_free(GWEN_REFPTR_INFO *rpi){
00127 if (rpi) {
00128 assert(rpi->refCount);
00129 if (--(rpi->refCount)==0) {
00130 DBG_VERBOUS(GWEN_LOGDOMAIN, "Freeing GWEN_RefPtrInfo");
00131 GWEN_FREE_OBJECT(rpi);
00132 }
00133 }
00134 }
00135
00136
00137
00138 void GWEN_RefPtrInfo_Attach(GWEN_REFPTR_INFO *rpi){
00139 assert(rpi);
00140 assert(rpi->refCount);
00141 rpi->refCount++;
00142 }
00143
00144
00145
00146 void GWEN_RefPtrInfo_SetFreeFn(GWEN_REFPTR_INFO *rpi,
00147 GWEN_REFPTR_INFO_FREE_FN f){
00148 assert(rpi);
00149 rpi->freeFn=f;
00150 }
00151
00152
00153
00154 void GWEN_RefPtrInfo_SetDupFn(GWEN_REFPTR_INFO *rpi,
00155 GWEN_REFPTR_INFO_DUP_FN f){
00156 assert(rpi);
00157 rpi->dupFn=f;
00158 }
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 GWEN_REFPTR *GWEN_RefPtr_new(void *dp, GWEN_REFPTR_INFO *rpi){
00173 GWEN_REFPTR *rp;
00174
00175 GWEN_NEW_OBJECT(GWEN_REFPTR, rp);
00176 rp->objectPtr=GWEN_RefPtrObject_new(dp, rpi);
00177 if (rpi)
00178 rp->objectPtr->flags=rpi->flags;
00179 return rp;
00180 }
00181
00182
00183
00184 void GWEN_RefPtr_free(GWEN_REFPTR *rp){
00185 if (rp) {
00186 DBG_VERBOUS(GWEN_LOGDOMAIN, "Freeing GWEN_RefPtr");
00187 GWEN_RefPtrObject_free(rp->objectPtr);
00188 GWEN_FREE_OBJECT(rp);
00189 }
00190 }
00191
00192
00193
00194 GWEN_REFPTR *GWEN_RefPtr_dup(const GWEN_REFPTR *rp){
00195 GWEN_REFPTR *nrp;
00196
00197 assert(rp);
00198 GWEN_NEW_OBJECT(GWEN_REFPTR, nrp);
00199 nrp->objectPtr=rp->objectPtr;
00200 GWEN_RefPtrObject_Attach(nrp->objectPtr);
00201 return nrp;
00202 }
00203
00204
00205
00206 GWEN_REFPTR *GWEN_RefPtr_copy(const GWEN_REFPTR *rp){
00207 GWEN_REFPTR *nrp;
00208
00209 assert(rp);
00210 if (rp->objectPtr) {
00211 if (rp->objectPtr->ptr) {
00212 if (rp->objectPtr->infoPtr) {
00213 if (rp->objectPtr->infoPtr->dupFn) {
00214 void *p;
00215
00216 p=rp->objectPtr->infoPtr->dupFn(rp->objectPtr->ptr);
00217 nrp=GWEN_RefPtr_new(p, rp->objectPtr->infoPtr);
00218 return nrp;
00219 }
00220 }
00221 }
00222 }
00223 return 0;
00224 }
00225
00226
00227
00228 void *GWEN_RefPtr_GetData(const GWEN_REFPTR *rp){
00229 if (!rp)
00230 return 0;
00231 if (rp->objectPtr) {
00232 return rp->objectPtr->ptr;
00233 }
00234 return 0;
00235 }
00236
00237
00238
00239 void GWEN_RefPtr_SetData(GWEN_REFPTR *rp, void *dp, GWEN_REFPTR_INFO *rpi){
00240 assert(rp);
00241
00242 if (rp->objectPtr) {
00243 GWEN_RefPtrObject_free(rp->objectPtr);
00244 }
00245 rp->objectPtr=GWEN_RefPtrObject_new(dp, rpi);
00246 }
00247
00248
00249
00250 uint32_t GWEN_RefPtr_GetFlags(const GWEN_REFPTR *rp){
00251 assert(rp);
00252 if (rp->objectPtr)
00253 return rp->objectPtr->flags;
00254 DBG_INFO(GWEN_LOGDOMAIN, "No object in RefPtr");
00255 return 0;
00256 }
00257
00258
00259
00260 void GWEN_RefPtr_SetFlags(GWEN_REFPTR *rp, uint32_t fl){
00261 assert(rp);
00262 if (rp->objectPtr)
00263 rp->objectPtr->flags=fl;
00264 else {
00265 DBG_INFO(GWEN_LOGDOMAIN, "No object in RefPtr");
00266 }
00267 }
00268
00269
00270
00271 void GWEN_RefPtr_AddFlags(GWEN_REFPTR *rp, uint32_t fl){
00272 assert(rp);
00273 if (rp->objectPtr)
00274 rp->objectPtr->flags|=fl;
00275 else {
00276 DBG_INFO(GWEN_LOGDOMAIN, "No object in RefPtr");
00277 }
00278 }
00279
00280
00281
00282 void GWEN_RefPtr_DelFlags(GWEN_REFPTR *rp, uint32_t fl){
00283 assert(rp);
00284 if (rp->objectPtr)
00285 rp->objectPtr->flags&=~fl;
00286 else {
00287 DBG_INFO(GWEN_LOGDOMAIN, "No object in RefPtr");
00288 }
00289 }
00290
00291
00292
00293
00294
00295
00296
00297
00298