Asterisk - The Open Source Telephony Project  18.5.0
Functions
rec_close.c File Reference
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/mman.h>
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <unistd.h>
#include "../include/db.h"
#include "recno.h"
Include dependency graph for rec_close.c:

Go to the source code of this file.

Functions

int __rec_close (DB *dbp)
 
int __rec_sync (DB *dbp, u_int flags) const
 

Function Documentation

◆ __rec_close()

int __rec_close ( DB dbp)

Definition at line 60 of file rec_close.c.

References __bt_close(), __rec_sync(), _btree::bt_mp, _btree::bt_msize, _btree::bt_pinned, _btree::bt_rfd, _btree::bt_rfp, _btree::bt_smap, F_ISSET, __db::internal, mpool_put(), NULL, R_CLOSEFP, R_INMEM, R_MEMMAPPED, RET_ERROR, RET_SUCCESS, and status.

Referenced by __rec_open().

62 {
63  BTREE *t;
64  int status;
65 
66  t = dbp->internal;
67 
68  /* Toss any page pinned across calls. */
69  if (t->bt_pinned != NULL) {
70  mpool_put(t->bt_mp, t->bt_pinned, 0);
71  t->bt_pinned = NULL;
72  }
73 
74  if (__rec_sync(dbp, 0) == RET_ERROR)
75  return (RET_ERROR);
76 
77  /* Committed to closing. */
78  status = RET_SUCCESS;
79  if (F_ISSET(t, R_MEMMAPPED) && munmap(t->bt_smap, t->bt_msize))
80  status = RET_ERROR;
81 
82  if (!F_ISSET(t, R_INMEM)) {
83  if (F_ISSET(t, R_CLOSEFP)) {
84  if (fclose(t->bt_rfp))
85  status = RET_ERROR;
86  } else
87  if (close(t->bt_rfd))
88  status = RET_ERROR;
89  }
90 
91  if (__bt_close(dbp) == RET_ERROR)
92  status = RET_ERROR;
93 
94  return (status);
95 }
int __bt_close(DB *dbp)
Definition: bt_close.c:64
int bt_rfd
Definition: btree.h:353
#define RET_ERROR
Definition: db.h:51
#define F_ISSET(p, f)
Definition: btree.h:42
caddr_t bt_smap
Definition: btree.h:356
int mpool_put(MPOOL *mp, void *page, u_int flags)
Definition: mpool.c:251
size_t bt_msize
Definition: btree.h:358
void * internal
Definition: db.h:137
#define NULL
Definition: resample.c:96
Definition: btree.h:312
#define RET_SUCCESS
Definition: db.h:52
PAGE * bt_pinned
Definition: btree.h:318
FILE * bt_rfp
Definition: btree.h:352
MPOOL * bt_mp
Definition: btree.h:313
#define R_INMEM
Definition: btree.h:381
#define R_MEMMAPPED
Definition: btree.h:380
#define R_CLOSEFP
Definition: btree.h:377
int __rec_sync(DB *dbp, u_int flags) const
Definition: rec_close.c:107
jack_status_t status
Definition: app_jack.c:146

◆ __rec_sync()

int __rec_sync ( DB dbp,
u_int  flags 
) const

Definition at line 107 of file rec_close.c.

References __bt_sync(), DBT::data, F_CLR, F_ISSET, __db::internal, MAX_REC_NUMBER, mpool_put(), NULL, R_EOF, R_FIRST, R_FIXLEN, R_INMEM, R_MODIFIED, R_NEXT, R_RDONLY, R_RECNOSYNC, RET_ERROR, RET_SUCCESS, DBT::size, and status.

Referenced by __rec_close(), and __rec_open().

110 {
111  struct iovec iov[2];
112  BTREE *t;
113  DBT data, key;
114  off_t off;
115  recno_t scursor, trec;
116  int status;
117 
118  t = dbp->internal;
119 
120  /* Toss any page pinned across calls. */
121  if (t->bt_pinned != NULL) {
122  mpool_put(t->bt_mp, t->bt_pinned, 0);
123  t->bt_pinned = NULL;
124  }
125 
126  if (flags == R_RECNOSYNC)
127  return (__bt_sync(dbp, 0));
128 
129  if (F_ISSET(t, R_RDONLY | R_INMEM) || !F_ISSET(t, R_MODIFIED))
130  return (RET_SUCCESS);
131 
132  /* Read any remaining records into the tree. */
133  if (!F_ISSET(t, R_EOF) && t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
134  return (RET_ERROR);
135 
136  /* Rewind the file descriptor. */
137  if (lseek(t->bt_rfd, (off_t)0, SEEK_SET) != 0)
138  return (RET_ERROR);
139 
140  /* Save the cursor. */
141  scursor = t->bt_cursor.rcursor;
142 
143  key.size = sizeof(recno_t);
144  key.data = &trec;
145 
146  if (F_ISSET(t, R_FIXLEN)) {
147  /*
148  * We assume that fixed length records are all fixed length.
149  * Any that aren't are either EINVAL'd or corrected by the
150  * record put code.
151  */
152  status = (dbp->seq)(dbp, &key, &data, R_FIRST);
153  while (status == RET_SUCCESS) {
154  if ((size_t) write(t->bt_rfd, data.data, data.size) != data.size)
155  return (RET_ERROR);
156  status = (dbp->seq)(dbp, &key, &data, R_NEXT);
157  }
158  } else {
159  iov[1].iov_base = &t->bt_bval;
160  iov[1].iov_len = 1;
161 
162  status = (dbp->seq)(dbp, &key, &data, R_FIRST);
163  while (status == RET_SUCCESS) {
164  iov[0].iov_base = data.data;
165  iov[0].iov_len = data.size;
166  if ((size_t) writev(t->bt_rfd, iov, 2) != data.size + 1)
167  return (RET_ERROR);
168  status = (dbp->seq)(dbp, &key, &data, R_NEXT);
169  }
170  }
171 
172  /* Restore the cursor. */
173  t->bt_cursor.rcursor = scursor;
174 
175  if (status == RET_ERROR)
176  return (RET_ERROR);
177  if ((off = lseek(t->bt_rfd, (off_t)0, SEEK_CUR)) == -1)
178  return (RET_ERROR);
179  if (ftruncate(t->bt_rfd, off))
180  return (RET_ERROR);
181  F_CLR(t, R_MODIFIED);
182  return (RET_SUCCESS);
183 }
void * data
Definition: db.h:86
size_t size
Definition: db.h:87
#define RET_ERROR
Definition: db.h:51
#define F_ISSET(p, f)
Definition: btree.h:42
int mpool_put(MPOOL *mp, void *page, u_int flags)
Definition: mpool.c:251
void * internal
Definition: db.h:137
Definition: db.h:85
#define F_CLR(p, f)
Definition: btree.h:41
#define NULL
Definition: resample.c:96
Definition: btree.h:312
#define R_MODIFIED
Definition: btree.h:382
#define R_RDONLY
Definition: btree.h:383
#define RET_SUCCESS
Definition: db.h:52
#define R_FIXLEN
Definition: btree.h:379
#define R_NEXT
Definition: db.h:97
#define R_INMEM
Definition: btree.h:381
#define R_EOF
Definition: btree.h:378
#define R_FIRST
Definition: db.h:93
int __bt_sync(DB *dbp, u_int flags) const
Definition: bt_close.c:119
#define MAX_REC_NUMBER
Definition: db.h:81
u_int32_t recno_t
Definition: db.h:82
jack_status_t status
Definition: app_jack.c:146
#define R_RECNOSYNC
Definition: db.h:101