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