CSN *csn_dup(const CSN *csn) { CSN *newcsn= NULL; if(csn!=NULL) { newcsn= csn_new(); csn_init_by_csn(newcsn,csn); } return newcsn; }
CSN *csn_new_by_string(const char *s) { CSN *newcsn= NULL; if(s!=NULL) { if(_csnIsValidString(s)) { newcsn= csn_new(); csn_init_by_string(newcsn,s); } } return newcsn; }
int csngen_new_csn (CSNGen *gen, CSN **csn, PRBool notify) { int rc = CSN_SUCCESS; time_t cur_time; int delta; if (gen == NULL || csn == NULL) { slapi_log_err(SLAPI_LOG_ERR, "csngen_new_csn", "Invalid argument\n"); return CSN_INVALID_PARAMETER; } *csn = csn_new (); if (*csn == NULL) { slapi_log_err(SLAPI_LOG_ERR, "csngen_new_csn", "Memory allocation failed\n"); return CSN_MEMORY_ERROR; } slapi_rwlock_wrlock (gen->lock); if (g_sampled_time == 0) csngen_update_time (); cur_time = g_sampled_time; /* check if the time should be adjusted */ delta = cur_time - gen->state.sampled_time; if (delta > 0) { rc = _csngen_adjust_local_time (gen, cur_time); if (rc != CSN_SUCCESS) { slapi_rwlock_unlock (gen->lock); return rc; } } else if (delta < -300) { /* * The maxseqnum could support up to 65535 CSNs per second. * That means that we could avoid duplicated CSN's for * delta up to 300 secs if update rate is 200/sec (usually * the max rate is below 20/sec). * Beyond 300 secs, we advance gen->state.sampled_time by * one sec to recycle seqnum. */ slapi_log_err(SLAPI_LOG_WARNING, "csngen_new_csn", "Too much time skew (%d secs). Current seqnum=%0x\n", delta, gen->state.seq_num ); rc = _csngen_adjust_local_time (gen, gen->state.sampled_time+1); if (rc != CSN_SUCCESS) { slapi_rwlock_unlock (gen->lock); return rc; } } if (gen->state.seq_num == CSN_MAX_SEQNUM) { slapi_log_err(SLAPI_LOG_INFO, "csngen_new_csn", "Sequence rollover; " "local offset updated.\n"); gen->state.local_offset ++; gen->state.seq_num = 0; } (*csn)->tstamp = CSN_CALC_TSTAMP(gen); (*csn)->seqnum = gen->state.seq_num ++; (*csn)->rid = gen->state.rid; (*csn)->subseqnum = 0; /* The lock is intentionally unlocked before callbacks are called. This is to prevent deadlocks. The callback management code has its own lock */ slapi_rwlock_unlock (gen->lock); /* notify modules that registered interest in csn generation */ if (notify) { _csngen_call_callbacks (gen, *csn, 0); } return rc; }