Yes that should ALSO be done. :-) There are probably several more places where we have printf.
This patch just fixes the missing parentheses. I could fix the printf too, while touching that line. / Anders Widell On 05/08/2014 03:33 PM, Hans Feldt wrote: > Why not just replace with trace? > /Hans > >> -----Original Message----- >> From: Anders Widell [mailto:anders.wid...@ericsson.com] >> Sent: den 8 maj 2014 15:04 >> To: ramesh.bet...@oracle.com >> Cc: opensaf-devel@lists.sourceforge.net >> Subject: [devel] [PATCH 1 of 1] osaf: Fix compilation errors when building >> with GCC 4.9.0 [#883] >> >> osaf/libs/core/common/ncs_main_pub.c | 2 +- >> osaf/libs/core/common/ncs_sprr.c | 2 +- >> osaf/libs/core/include/ncssysf_def.h | 4 ++-- >> osaf/libs/core/leap/hj_dec.c | 4 ++-- >> osaf/libs/core/leap/hj_enc.c | 8 ++++---- >> osaf/libs/core/leap/hj_hdl.c | 18 +++++++++--------- >> osaf/libs/core/leap/hj_ubaid.c | 6 +++--- >> osaf/libs/core/leap/sysf_ipc.c | 6 +++--- >> osaf/libs/core/leap/sysf_mem.c | 4 ++-- >> osaf/libs/core/leap/sysf_tmr.c | 2 +- >> osaf/services/infrastructure/fm/fms/fm_mds.c | 2 +- >> osaf/services/saf/clmsv/clms/clms_mbcsv.c | 2 +- >> osaf/services/saf/cpsv/cpd/cpd_amf.c | 4 ++-- >> osaf/services/saf/cpsv/cpd/cpd_mds.c | 2 +- >> osaf/services/saf/glsv/gld/gld_evt.c | 2 +- >> osaf/services/saf/logsv/lgs/lgs_mbcsv.c | 2 +- >> osaf/services/saf/ntfsv/ntfs/ntfs_mbcsv.c | 2 +- >> 17 files changed, 36 insertions(+), 36 deletions(-) >> >> >> OpenSAF did not build successfully with GCC 4.9.0, due to a new warning: >> >> In file included from ncs_sprr.c:37:0: >> ncs_sprr.c: In function 'ncs_splr_api': >> ../../../../osaf/libs/core/include/ncssysf_def.h:105:54: error: right-hand >> operand of comma expression has no effect [- >> Werror=unused-value] >> #define m_LEAP_DBG_SINK(r) (TRACE("IN LEAP_DBG_SINK"), r) >> ^ >> ncs_sprr.c:46:58: note: in expansion of macro 'm_LEAP_DBG_SINK' >> #define m_NCS_SPRR_DBG_SINK(x,y) printf("SPRR:%s\n", y),m_LEAP_DBG_SINK(x) >> ^ >> ncs_sprr.c:237:9: note: in expansion of macro 'm_NCS_SPRR_DBG_SINK' >> rc = m_NCS_SPRR_DBG_SINK(NCSCC_RC_DUPLICATE_ENTRY, "SPLR duplication >> attempted"); >> >> The warning actually pointed out a rather tricky bug in ncs_sprr.c, that is >> not >> obvious the first time you look at the code. The bug is that the comma >> operator >> is used within a C preprocessor macro, without surrounding parentheses. When >> this macro is used in an assignment statement, the code does not do what you >> would expect, since the comma operator has lower precedence than the >> assignment >> operator in the C language. >> >> By adding parentheses around the macro definition, this bug is solved. >> >> diff --git a/osaf/libs/core/common/ncs_main_pub.c >> b/osaf/libs/core/common/ncs_main_pub.c >> --- a/osaf/libs/core/common/ncs_main_pub.c >> +++ b/osaf/libs/core/common/ncs_main_pub.c >> @@ -759,7 +759,7 @@ void ncs_get_sys_params_arg(NCS_SYS_PARA >> if (m_NCS_GET_PHYINFO_FROM_NODE_ID(sys_params->node_id, >> &sys_params->shelf_id, >> &sys_params->slot_id, &sub_slot_id) >> != NCSCC_RC_SUCCESS) { >> >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); >> + m_LEAP_DBG_SINK_VOID; >> return; >> } >> >> diff --git a/osaf/libs/core/common/ncs_sprr.c >> b/osaf/libs/core/common/ncs_sprr.c >> --- a/osaf/libs/core/common/ncs_sprr.c >> +++ b/osaf/libs/core/common/ncs_sprr.c >> @@ -43,7 +43,7 @@ >> #ifdef NDEBUG >> #define m_NCS_SPRR_DBG_SINK(x,y) (x) >> #else >> -#define m_NCS_SPRR_DBG_SINK(x,y) printf("SPRR:%s\n", y),m_LEAP_DBG_SINK(x) >> +#define m_NCS_SPRR_DBG_SINK(x,y) (printf("SPRR:%s\n", >> y),m_LEAP_DBG_SINK(x)) >> #endif >> >> #define m_NCSSPRR_TRACE_ARG2(x,y) >> diff --git a/osaf/libs/core/include/ncssysf_def.h >> b/osaf/libs/core/include/ncssysf_def.h >> --- a/osaf/libs/core/include/ncssysf_def.h >> +++ b/osaf/libs/core/include/ncssysf_def.h >> @@ -91,8 +91,8 @@ void opensaf_reboot(unsigned node_id, co >> ** >> ** >> >> ****************************************************************************/ >> >> -#define m_KEY_CHK_FMT(k,f) { if (k.fmat != f) m_LEAP_DBG_SINK(0);} >> -#define m_KEY_CHK_LEN(l) { if (l > SYSF_MAX_KEY_LEN) m_LEAP_DBG_SINK(0); >> } >> +#define m_KEY_CHK_FMT(k,f) { if (k.fmat != f) m_LEAP_DBG_SINK_VOID;} >> +#define m_KEY_CHK_LEN(l) { if (l > SYSF_MAX_KEY_LEN) >> m_LEAP_DBG_SINK_VOID; } >> #define m_KEY_CHK_SLEN(s) { uint32_t l = m_NCS_STRLEN(s); >> m_KEY_CHK_LEN(l); } >> >> /* >> diff --git a/osaf/libs/core/leap/hj_dec.c b/osaf/libs/core/leap/hj_dec.c >> --- a/osaf/libs/core/leap/hj_dec.c >> +++ b/osaf/libs/core/leap/hj_dec.c >> @@ -68,7 +68,7 @@ USRBUF *ncs_decode_n_octets(USRBUF *u, u >> **/ >> if ((s = m_MMGR_DATA_AT_START(u, count, (char *)os)) != (char *)os) { >> if (s == 0) { >> - m_LEAP_DBG_SINK(0); >> + m_LEAP_DBG_SINK_VOID; >> return (USRBUF *)0; >> } >> memcpy(os, s, (size_t)count); >> @@ -84,7 +84,7 @@ USRBUF *ncs_decode_n_octets(USRBUF *u, u >> uint8_t *ncs_flatten_n_octets(USRBUF *u, uint8_t *os, uint32_t count) >> { >> if (u == BNULL) { >> - m_LEAP_DBG_SINK(0); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } >> >> diff --git a/osaf/libs/core/leap/hj_enc.c b/osaf/libs/core/leap/hj_enc.c >> --- a/osaf/libs/core/leap/hj_enc.c >> +++ b/osaf/libs/core/leap/hj_enc.c >> @@ -171,7 +171,7 @@ USRBUF *ncs_prepend_n_octets(USRBUF *pbu >> >> pch = m_MMGR_RESERVE_AT_START(&pbuf, length, uint8_t *); >> if (pch == NULL) { >> - m_LEAP_DBG_SINK((long)BNULL); >> + m_LEAP_DBG_SINK_VOID; >> return BNULL; >> } >> >> @@ -185,7 +185,7 @@ USRBUF *ncs_prepend_uns16(USRBUF *pbuf, >> >> p16 = m_MMGR_RESERVE_AT_START(&pbuf, (uint32_t)sizeof(uint16_t), >> uint8_t *); >> if (p16 == NULL) { >> - m_LEAP_DBG_SINK((long)BNULL); >> + m_LEAP_DBG_SINK_VOID; >> return BNULL; >> } >> *p16++ = (uint8_t)(val16 >> 8); >> @@ -200,7 +200,7 @@ USRBUF *ncs_prepend_uns32(USRBUF *pbuf, >> >> p32 = m_MMGR_RESERVE_AT_START(&pbuf, (uint32_t)sizeof(uint32_t), >> uint8_t *); >> if (p32 == NULL) { >> - m_LEAP_DBG_SINK((long)BNULL); >> + m_LEAP_DBG_SINK_VOID; >> return BNULL; >> } >> *p32++ = (uint8_t)(val32 >> 24); >> @@ -217,7 +217,7 @@ USRBUF *ncs_prepend_uns64(USRBUF *pbuf, >> >> p64 = m_MMGR_RESERVE_AT_START(&pbuf, 8, uint8_t *); >> if (p64 == NULL) { >> - m_LEAP_DBG_SINK((long)BNULL); >> + m_LEAP_DBG_SINK_VOID; >> return BNULL; >> } >> >> diff --git a/osaf/libs/core/leap/hj_hdl.c b/osaf/libs/core/leap/hj_hdl.c >> --- a/osaf/libs/core/leap/hj_hdl.c >> +++ b/osaf/libs/core/leap/hj_hdl.c >> @@ -398,7 +398,7 @@ NCSCONTEXT ncshm_take_hdl(NCS_SERVICE_ID >> if ((cell = hm_find_cell(hdl)) != NULL) { >> if ((cell->seq_id == hdl->seq_id) && >> ((NCS_SERVICE_ID)cell->svc_id == id) && (cell->busy == true)) { >> if (++cell->use_ct == 0) { >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); /* Too >> many takes()s!! */ >> + m_LEAP_DBG_SINK_VOID; /* Too many takes()s!! >> */ >> } >> >> data = cell->data; >> @@ -432,7 +432,7 @@ void ncshm_give_hdl(uint32_t uhdl) >> if ((cell = hm_find_cell(hdl)) != NULL) { >> if (cell->seq_id == hdl->seq_id) { >> if (--cell->use_ct < 1) { >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); /* >> Client BUG..Too many give()s!! */ >> + m_LEAP_DBG_SINK_VOID; /* Client BUG..Too many >> give()s!! */ >> cell->use_ct++; >> } else { >> if ((cell->busy == false) && (cell->use_ct == >> 1)) >> @@ -464,7 +464,7 @@ HM_FREE *hm_alloc_cell(uint8_t id) >> >> if (pmgr->free_pool == NULL) { >> if (hm_make_free_cells(pmgr) != NCSCC_RC_SUCCESS) { >> - m_LEAP_DBG_SINK(NULL); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } >> } >> @@ -495,12 +495,12 @@ HM_CELL *hm_find_cell(HM_HDL *hdl) >> HM_CELLS *spot; >> >> if ((unit = gl_hm.unit[hdl->idx1]) == NULL) { >> - m_LEAP_DBG_SINK(NULL); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } >> >> if ((spot = unit->cells[hdl->idx2]) == NULL) { >> - m_LEAP_DBG_SINK(NULL); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } >> >> @@ -622,7 +622,7 @@ HM_FREE *hm_target_cell(HM_HDL *hdl) >> >> if ((unit = gl_hm.unit[hdl->idx1]) == NULL) { >> if ((unit = (HM_UNIT*) malloc(sizeof(HM_UNIT))) == NULL) { >> - m_LEAP_DBG_SINK(NULL); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } >> >> @@ -632,7 +632,7 @@ HM_FREE *hm_target_cell(HM_HDL *hdl) >> >> if ((cells = unit->cells[hdl->idx2]) == NULL) { >> if ((cells = (HM_CELLS*) malloc(sizeof(HM_CELLS))) == NULL) { >> - m_LEAP_DBG_SINK(NULL); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } >> >> @@ -669,7 +669,7 @@ HM_FREE *hm_target_cell(HM_HDL *hdl) >> back = back->next; >> } >> >> - m_LEAP_DBG_SINK(NULL); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } >> >> @@ -775,7 +775,7 @@ uint32_t ncslpg_give(NCSLPG_OBJ *pg, uin >> uint32_t ncslpg_create(NCSLPG_OBJ *pg) >> { >> if (pg->open == true) >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); >> + m_LEAP_DBG_SINK_VOID; >> pg->open = true; >> pg->inhere = 0; >> return NCSCC_RC_SUCCESS; >> diff --git a/osaf/libs/core/leap/hj_ubaid.c b/osaf/libs/core/leap/hj_ubaid.c >> --- a/osaf/libs/core/leap/hj_ubaid.c >> +++ b/osaf/libs/core/leap/hj_ubaid.c >> @@ -329,7 +329,7 @@ void ncs_dec_init_space(NCS_UBAID *uba, >> uint8_t *ncs_dec_flatten_space(NCS_UBAID *uba, uint8_t *os, int32_t count) >> { >> if (uba->ub == BNULL) { >> - m_LEAP_DBG_SINK(NULL); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } >> >> @@ -619,7 +619,7 @@ USRBUF *ncs_decode_pointer(USRBUF *i_ub, >> *o_recvd_ptr = ncs_decode_32bit(&s); >> else { >> if (p_len != sizeof(NCSCONTEXT)) >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); >> + m_LEAP_DBG_SINK_VOID; >> *o_recvd_ptr = ncs_decode_64bit(&s); >> } >> >> @@ -673,7 +673,7 @@ uint32_t ncs_uba_decode_pointer(NCS_UBAI >> *o_recvd_ptr = ncs_decode_32bit(&s); >> else { >> if (p_len != sizeof(NCSCONTEXT)) >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); >> + m_LEAP_DBG_SINK_VOID; >> >> *o_recvd_ptr = ncs_decode_64bit(&s); >> } >> diff --git a/osaf/libs/core/leap/sysf_ipc.c b/osaf/libs/core/leap/sysf_ipc.c >> --- a/osaf/libs/core/leap/sysf_ipc.c >> +++ b/osaf/libs/core/leap/sysf_ipc.c >> @@ -360,7 +360,7 @@ static NCS_IPC_MSG *ncs_ipc_recv_common( >> /* Should never reach here */ >> m_NCS_UNLOCK(&ncs_ipc->queue_lock, >> NCS_LOCK_WRITE); >> ncshm_give_hdl((uint32_t)*mbx); >> - m_LEAP_DBG_SINK(0); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } else { >> m_NCS_UNLOCK(&ncs_ipc->queue_lock, >> NCS_LOCK_WRITE); >> @@ -381,7 +381,7 @@ static NCS_IPC_MSG *ncs_ipc_recv_common( >> if (ipc_dequeue_ind_processing(ncs_ipc, >> active_queue) != NCSCC_RC_SUCCESS) { >> >> m_NCS_UNLOCK(&ncs_ipc->queue_lock, NCS_LOCK_WRITE); >> ncshm_give_hdl((uint32_t)*mbx); >> - m_LEAP_DBG_SINK(NULL); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } else { >> >> m_NCS_UNLOCK(&ncs_ipc->queue_lock, NCS_LOCK_WRITE); >> @@ -394,7 +394,7 @@ static NCS_IPC_MSG *ncs_ipc_recv_common( >> assert(0); >> m_NCS_UNLOCK(&ncs_ipc->queue_lock, NCS_LOCK_WRITE); >> ncshm_give_hdl((uint32_t)*mbx); >> - m_LEAP_DBG_SINK(NULL); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } >> >> diff --git a/osaf/libs/core/leap/sysf_mem.c b/osaf/libs/core/leap/sysf_mem.c >> --- a/osaf/libs/core/leap/sysf_mem.c >> +++ b/osaf/libs/core/leap/sysf_mem.c >> @@ -139,7 +139,7 @@ void sysf_heap_free(void *data, uint8_t >> >> void *sysf_stub_alloc(uint32_t b, uint8_t pool_id, uint8_t pri) >> { >> - m_LEAP_DBG_SINK(0); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } >> >> @@ -427,7 +427,7 @@ USRBUF *sysf_alloc_pkt(unsigned char poo >> >> if (pool_id >= UB_MAX_POOLS) { >> m_PMGR_UNLK(&gl_ub_pool_mgr.lock); >> - m_LEAP_DBG_SINK(0); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } >> ud = (USRDATA >> *)gl_ub_pool_mgr.pools[pool_id].mem_alloc(sizeof(USRDATA), pool_id, >> priority); >> diff --git a/osaf/libs/core/leap/sysf_tmr.c b/osaf/libs/core/leap/sysf_tmr.c >> --- a/osaf/libs/core/leap/sysf_tmr.c >> +++ b/osaf/libs/core/leap/sysf_tmr.c >> @@ -737,7 +737,7 @@ tmr_t ncs_tmr_start(tmr_t tid, uint32_t >> if (m_NCS_SEL_OBJ_IND(gl_tcb.sel_obj) != NCSCC_RC_SUCCESS) { >> /* We would never reach here! */ >> m_NCS_UNLOCK(&gl_tcb.safe.enter_lock, NCS_LOCK_WRITE); >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); >> + m_LEAP_DBG_SINK_VOID; >> return NULL; >> } >> } >> diff --git a/osaf/services/infrastructure/fm/fms/fm_mds.c >> b/osaf/services/infrastructure/fm/fms/fm_mds.c >> --- a/osaf/services/infrastructure/fm/fms/fm_mds.c >> +++ b/osaf/services/infrastructure/fm/fms/fm_mds.c >> @@ -708,7 +708,7 @@ static uint32_t fm_fm_mds_enc(MDS_CALLBA >> case GFM_GFM_EVT_NODE_INFO_EXCHANGE: >> data = ncs_enc_reserve_space(uba, (2 * sizeof(uint32_t))); >> if (data == NULL) { >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); >> + m_LEAP_DBG_SINK_VOID; >> } >> >> ncs_encode_32bit(&data, msg->info.node_info.node_id); >> diff --git a/osaf/services/saf/clmsv/clms/clms_mbcsv.c >> b/osaf/services/saf/clmsv/clms/clms_mbcsv.c >> --- a/osaf/services/saf/clmsv/clms/clms_mbcsv.c >> +++ b/osaf/services/saf/clmsv/clms/clms_mbcsv.c >> @@ -2010,7 +2010,7 @@ static uint32_t ckpt_decode_cbk_handler( >> TRACE_2(" INCORRECT DECODE called"); >> rc = NCSCC_RC_FAILURE; >> TRACE(" INCORRECT DECODE called, FAILED"); >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); >> + m_LEAP_DBG_SINK_VOID; >> break; >> } /*End switch(io_msg_type) */ >> >> diff --git a/osaf/services/saf/cpsv/cpd/cpd_amf.c >> b/osaf/services/saf/cpsv/cpd/cpd_amf.c >> --- a/osaf/services/saf/cpsv/cpd/cpd_amf.c >> +++ b/osaf/services/saf/cpsv/cpd/cpd_amf.c >> @@ -181,7 +181,7 @@ void cpd_saf_csi_set_cb(SaInvocationT in >> vda_info.info.vdest_chg_role.i_new_role = mds_role; >> rc = ncsvda_api(&vda_info); >> if (NCSCC_RC_SUCCESS != rc) { >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); >> + m_LEAP_DBG_SINK_VOID; >> LOG_ER("cpd vdest change role failed"); >> ncshm_give_hdl(cb->cpd_hdl); >> TRACE_LEAVE(); >> @@ -206,7 +206,7 @@ void cpd_saf_csi_set_cb(SaInvocationT in >> vda_info.info.vdest_chg_role.i_new_role = mds_role; >> rc = ncsvda_api(&vda_info); >> if (NCSCC_RC_SUCCESS != rc) { >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); >> + m_LEAP_DBG_SINK_VOID; >> LOG_ER("cpd vdest change role failed"); >> ncshm_give_hdl(cb->cpd_hdl); >> TRACE_LEAVE(); >> diff --git a/osaf/services/saf/cpsv/cpd/cpd_mds.c >> b/osaf/services/saf/cpsv/cpd/cpd_mds.c >> --- a/osaf/services/saf/cpsv/cpd/cpd_mds.c >> +++ b/osaf/services/saf/cpsv/cpd/cpd_mds.c >> @@ -84,7 +84,7 @@ uint32_t cpd_mds_vdest_create(CPD_CB *cb >> /* Create VDEST */ >> rc = ncsvda_api(&arg); >> if (NCSCC_RC_SUCCESS != rc) { >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); >> + m_LEAP_DBG_SINK_VOID; >> return rc; >> } >> >> diff --git a/osaf/services/saf/glsv/gld/gld_evt.c >> b/osaf/services/saf/glsv/gld/gld_evt.c >> --- a/osaf/services/saf/glsv/gld/gld_evt.c >> +++ b/osaf/services/saf/glsv/gld/gld_evt.c >> @@ -688,7 +688,7 @@ static uint32_t gld_quisced_process(GLSV >> gld_cb->is_impl_set = false; >> rc = glsv_gld_mbcsv_chgrole(gld_cb); >> if (rc != NCSCC_RC_SUCCESS) { >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); >> + m_LEAP_DBG_SINK_VOID; >> goto end; >> } >> saAmfResponse(gld_cb->amf_hdl, gld_cb->invocation, saErr); >> diff --git a/osaf/services/saf/logsv/lgs/lgs_mbcsv.c >> b/osaf/services/saf/logsv/lgs/lgs_mbcsv.c >> --- a/osaf/services/saf/logsv/lgs/lgs_mbcsv.c >> +++ b/osaf/services/saf/logsv/lgs/lgs_mbcsv.c >> @@ -832,7 +832,7 @@ static uint32_t ckpt_decode_cbk_handler( >> TRACE_2(" INCORRECT DECODE called"); >> rc = NCSCC_RC_FAILURE; >> TRACE(" INCORRECT DECODE called, FAILED"); >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); >> + m_LEAP_DBG_SINK_VOID; >> break; >> } /*End switch(io_msg_type) */ >> >> diff --git a/osaf/services/saf/ntfsv/ntfs/ntfs_mbcsv.c >> b/osaf/services/saf/ntfsv/ntfs/ntfs_mbcsv.c >> --- a/osaf/services/saf/ntfsv/ntfs/ntfs_mbcsv.c >> +++ b/osaf/services/saf/ntfsv/ntfs/ntfs_mbcsv.c >> @@ -680,7 +680,7 @@ static uint32_t ckpt_decode_cbk_handler( >> TRACE_2(" INCORRECT DECODE called"); >> rc = NCSCC_RC_FAILURE; >> TRACE(" INCORRECT DECODE called, FAILED"); >> - m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); >> + m_LEAP_DBG_SINK_VOID; >> break; >> } /*End switch(io_msg_type) */ >> >> >> ------------------------------------------------------------------------------ >> Is your legacy SCM system holding you back? Join Perforce May 7 to find out: >> • 3 signs your SCM is hindering your productivity >> • Requirements for releasing software faster >> • Expert tips and advice for migrating your SCM now >> http://p.sf.net/sfu/perforce >> _______________________________________________ >> Opensaf-devel mailing list >> Opensaf-devel@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/opensaf-devel ------------------------------------------------------------------------------ Is your legacy SCM system holding you back? Join Perforce May 7 to find out: • 3 signs your SCM is hindering your productivity • Requirements for releasing software faster • Expert tips and advice for migrating your SCM now http://p.sf.net/sfu/perforce _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel