You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by gs...@locus.apache.org on 2000/12/09 10:07:15 UTC

cvs commit: apr-util/test .cvsignore Makefile.in testdbm.c

gstein      00/12/09 01:07:15

  Modified:    src/dbm  apr_dbm.c
               test     .cvsignore Makefile.in testdbm.c
  Log:
  *) some DBMs need cleanups registered for the memory they return, just in
     case the caller forgets to call apr_dbm_freedatum() on it.
  
  *) add testdbm to .cvsignore
  
  *) add more dependencies on the testdbm make target
  
  *) testdbm: proactively toss the pool [and terminate APR]. it seemed the
     pool wasn't getting registered within APR for cleanup(?)
  
  Revision  Changes    Path
  1.10      +35 -7     apr-util/src/dbm/apr_dbm.c
  
  Index: apr_dbm.c
  ===================================================================
  RCS file: /home/cvs/apr-util/src/dbm/apr_dbm.c,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -u -r1.9 -r1.10
  --- apr_dbm.c	2000/12/08 17:18:08	1.9
  +++ apr_dbm.c	2000/12/09 09:07:14	1.10
  @@ -71,7 +71,7 @@
   #define APR_DBM_DELETE(f, k)	sdbm_delete((f), (k))
   #define APR_DBM_FIRSTKEY(f)	sdbm_firstkey(f)
   #define APR_DBM_NEXTKEY(f, k)	sdbm_nextkey(f)
  -#define APR_DBM_FREEDATUM(f, d)	if (0) ; else	/* stop "no effect" warning */
  +#define APR_DBM_FREEDPTR(dptr)	if (0) ; else	/* stop "no effect" warning */
   
   #define APR_DBM_DBMODE_RO       APR_READ
   #define APR_DBM_DBMODE_RW       (APR_READ | APR_WRITE)
  @@ -90,8 +90,10 @@
   #define APR_DBM_DELETE(f, k)	g2s(gdbm_delete((f), (k)))
   #define APR_DBM_FIRSTKEY(f)	gdbm_firstkey(f)
   #define APR_DBM_NEXTKEY(f, k)	gdbm_nextkey((f), (k))
  -#define APR_DBM_FREEDATUM(f, d)	((d).dptr ? free((d).dptr) : 0)
  +#define APR_DBM_FREEDPTR(dptr)	((dptr) ? free(dptr) : 0)
   
  +#define NEEDS_CLEANUP
  +
   #define APR_DBM_DBMODE_RO       GDBM_READER
   #define APR_DBM_DBMODE_RW       GDBM_WRITER
   #define APR_DBM_DBMODE_RWCREATE GDBM_WRCREAT
  @@ -126,6 +128,26 @@
   #define R2A_DATUM(d)    (*(apr_datum_t *)&(d))
   
   
  +#ifdef NEEDS_CLEANUP
  +
  +static apr_status_t datum_cleanup(void *dptr)
  +{
  +    APR_DBM_FREEDPTR(dptr);
  +    return APR_SUCCESS;
  +}
  +
  +#define REG_CLEANUP(db, pdatum) \
  +    if ((pdatum)->dptr) \
  +        apr_register_cleanup((db)->pool, (pdatum)->dptr, \
  +                             datum_cleanup, apr_null_cleanup); \
  +    else
  +
  +#else /* NEEDS_CLEANUP */
  +
  +#define REG_CLEANUP(db, pdatum) if (0) ; else   /* stop "no effect" warning */
  +
  +#endif /* NEEDS_CLEANUP */
  +
   static apr_status_t set_error(apr_dbm_t *db)
   {
       apr_status_t rv = APR_SUCCESS;
  @@ -217,6 +239,8 @@
   {
       *(real_datum_t *) pvalue = APR_DBM_FETCH(db->file, A2R_DATUM(key));
   
  +    REG_CLEANUP(db, pvalue);
  +
       /* store the error info into DB, and return a status code. Also, note
          that *pvalue should have been cleared on error. */
       return set_error(db);
  @@ -272,6 +296,8 @@
   {
       *(real_datum_t *) pkey = APR_DBM_FIRSTKEY(db->file);
   
  +    REG_CLEANUP(db, pkey);
  +
       /* store the error info into DB, and return a status code. Also, note
          that *pvalue should have been cleared on error. */
       return set_error(db);
  @@ -281,18 +307,20 @@
   {
       *(real_datum_t *) pkey = APR_DBM_NEXTKEY(db->file, A2R_DATUM(*pkey));
   
  +    REG_CLEANUP(db, pkey);
  +
       /* store the error info into DB, and return a status code. Also, note
          that *pvalue should have been cleared on error. */
       return set_error(db);
   }
   
  -/* XXX: This is wrong - we must call freedatum after moving the
  - * datum contents into the pool before we return, the user can't
  - * concern themselves with free in a pool-managed application.
  - */
   void apr_dbm_freedatum(apr_dbm_t *db, apr_datum_t data)
   {
  -    APR_DBM_FREEDATUM(db, data);
  +#ifdef NEEDS_CLEANUP
  +    (void) apr_run_cleanup(db->pool, data.dptr, datum_cleanup);
  +#else
  +    APR_DBM_FREEDPTR(data.dptr);
  +#endif
   }
   
   /* XXX: This is wrong... need to return a canonical errcode as part
  
  
  
  1.2       +1 -0      apr-util/test/.cvsignore
  
  Index: .cvsignore
  ===================================================================
  RCS file: /home/cvs/apr-util/test/.cvsignore,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -u -r1.1 -r1.2
  --- .cvsignore	2000/12/02 16:13:50	1.1
  +++ .cvsignore	2000/12/09 09:07:14	1.2
  @@ -2,3 +2,4 @@
   *.lo
   *.la
   .libs
  +testdbm
  
  
  
  1.4       +1 -1      apr-util/test/Makefile.in
  
  Index: Makefile.in
  ===================================================================
  RCS file: /home/cvs/apr-util/test/Makefile.in,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -u -r1.3 -r1.4
  --- Makefile.in	2000/12/08 22:50:39	1.3
  +++ Makefile.in	2000/12/09 09:07:14	1.4
  @@ -8,5 +8,5 @@
   
   testdbm_OBJECTS = testdbm.lo
   testdbm_LDADD =  ../libaprutil.la @APR_SOURCE_DIR@/libapr.a
  -testdbm: $(testdbm_OBJECTS)
  +testdbm: $(testdbm_OBJECTS) $(testdbm_LDADD)
   	$(LINK) $(testdbm_OBJECTS) $(testdbm_LDADD) $(LIBS)
  
  
  
  1.4       +3 -2      apr-util/test/testdbm.c
  
  Index: testdbm.c
  ===================================================================
  RCS file: /home/cvs/apr-util/test/testdbm.c,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -u -r1.3 -r1.4
  --- testdbm.c	2000/12/08 18:05:33	1.3
  +++ testdbm.c	2000/12/09 09:07:14	1.4
  @@ -135,8 +135,6 @@
       const char *optarg;
   
       (void) apr_initialize();
  -    atexit(apr_terminate);
  -
       apr_create_pool(&pool, NULL);
   
       (void) apr_initopt(&os, pool, argc, argv);
  @@ -161,6 +159,9 @@
           badk(argv[os->ind]);
       os->ind++;
       doit(act, argv[os->ind], pool);
  +
  +    apr_destroy_pool(pool);
  +    apr_terminate();
       return 0;
   }