From 14583c205cf103fd917076712cc89faec00c0b4e Mon Sep 17 00:00:00 2001 From: Adam Wujek <adam.wujek@cern.ch> Date: Wed, 11 Feb 2015 17:04:06 +0100 Subject: [PATCH] arch-wrs: add locking on writes to ppsi shemem Signed-off-by: Adam Wujek <adam.wujek@cern.ch> --- arch-wrs/wrs-startup.c | 11 ++++++++--- proto-ext-whiterabbit/wr-servo.c | 14 +++++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/arch-wrs/wrs-startup.c b/arch-wrs/wrs-startup.c index f9f9560a..380035a7 100644 --- a/arch-wrs/wrs-startup.c +++ b/arch-wrs/wrs-startup.c @@ -58,7 +58,7 @@ struct minipc_ch *hal_ch; struct minipc_ch *ppsi_ch; struct hal_port_state *hal_ports; int hal_nports; - +struct wrs_shm_head *ppsi_head; /* * we need to call calloc, to reset all stuff that used to be static, * but we'd better have a simple prototype, compatilble with wrs_shm_alloc() @@ -80,7 +80,7 @@ int main(int argc, char **argv) unsigned long seed; struct timex t; int i, hal_retries; - struct wrs_shm_head *hal_head, *ppsi_head; + struct wrs_shm_head *hal_head; struct hal_shmem_header *h; void *(*alloc_fn)(void *headptr, size_t size) = local_malloc; @@ -139,7 +139,8 @@ int main(int argc, char **argv) } wrs_init_ipcserver(ppsi_ch); - ppsi_head = wrs_shm_get(wrs_shm_ptp, "ppsi", WRS_SHM_WRITE); + ppsi_head = wrs_shm_get(wrs_shm_ptp, "ppsi", + WRS_SHM_WRITE | WRS_SHM_LOCKED); if (!ppsi_head) { fprintf(stderr, "Fatal: could not create shmem: %s\n", strerror(errno)); @@ -241,6 +242,10 @@ int main(int argc, char **argv) seed = atoi(getenv("PPSI_DROP_SEED")); ppsi_drop_init(ppg, seed); + /* release lock from wrs_shm_get */ + if (BUILT_WITH_WHITERABBIT) + wrs_shm_write(ppsi_head, WRS_SHM_WRITE_END); + wrs_main_loop(ppg); return 0; /* never reached */ } diff --git a/proto-ext-whiterabbit/wr-servo.c b/proto-ext-whiterabbit/wr-servo.c index f43319be..12c5995d 100644 --- a/proto-ext-whiterabbit/wr-servo.c +++ b/proto-ext-whiterabbit/wr-servo.c @@ -1,5 +1,6 @@ #include <ppsi/ppsi.h> #include "wr-api.h" +#include <libwr/shmem.h> #define WR_SERVO_NONE 0 #define WR_SYNC_NSEC 1 @@ -26,6 +27,7 @@ static const char *servo_name[] = { ptpdexp_sync_state_t cur_servo_state; /* Exported with mini-rpc */ static int tracking_enabled = 1; /* FIXME: why? */ +extern struct wrs_shm_head *ppsi_head; void wr_servo_enable_tracking(int enable) { @@ -149,7 +151,8 @@ int wr_servo_init(struct pp_instance *ppi) struct wr_dsport *wrp = WR_DSPOR(ppi); struct wr_servo_state_t *s = &((struct wr_data_t *)ppi->ext_data)->servo_state; - + /* shmem lock */ + wrs_shm_write(ppsi_head, WRS_SHM_WRITE_BEGIN); /* Determine the alpha coefficient */ if (wrp->ops->read_calib_data(ppi, 0, 0, &s->fiber_fix_alpha, &s->clock_period_ps) != WR_HW_CALIB_OK) @@ -190,6 +193,9 @@ int wr_servo_init(struct pp_instance *ppi) s->update_count = 0; got_sync = 0; + + /* shmem unlock */ + wrs_shm_write(ppsi_head, WRS_SHM_WRITE_END); return 0; } @@ -257,6 +263,10 @@ int wr_servo_update(struct pp_instance *ppi) s->t3.correct, s->t4.correct); return 0; } + + /* shmem lock */ + wrs_shm_write(ppsi_head, WRS_SHM_WRITE_BEGIN); + errcount = 0; cur_servo_state.update_count++; @@ -411,5 +421,7 @@ int wr_servo_update(struct pp_instance *ppi) break; } + /* shmem unlock */ + wrs_shm_write(ppsi_head, WRS_SHM_WRITE_END); return 0; } -- GitLab