SIONlib  1.7.1
Scalable I/O library for parallel access to task-local files
sion_lock.c
Go to the documentation of this file.
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2016 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
14 #include <stdlib.h>
15 #include <stdio.h>
16 #include <string.h>
17 #include <stdarg.h>
18 #include <assert.h>
19 #define sion_assert(expr, args) (assert(expr))
20 
21 #include "sion.h"
22 #include "sion_debug.h"
23 #include "sion_internal.h"
24 #include "sion_fd.h"
25 #include "sion_filedesc.h"
26 #include "sion_printts.h"
27 
28 #include "sion_lock.h"
29 
32  int lock_defined;
33  int (*user_lock)(void *);
34  int (*user_unlock)(void *);
35  void *user_lock_data;
36 };
38 static _sion_lock_user_cb_t _sion_lock_user_cb = {0, NULL, NULL, NULL};
39 
40 /* from configure */
41 #ifdef SION_PTHREADS
42 /* from Makefile */
43 #ifdef SION_USE_PTHREADS
44 #define _USE_PTHREADS
45 #endif
46 #else
47 #define _USE_NOT_PTHREADS
48 #endif
49 
50 #ifdef _USE_PTHREADS
51 #include <pthread.h>
52 #define SION_FDDATA_INITIALIZER {PTHREAD_MUTEX_INITIALIZER}
53 #else
54 #define SION_FDDATA_INITIALIZER {}
55 #endif
56 
57 #ifdef _USE_PTHREADS
58 static struct _sion_lockdata {
59  pthread_mutex_t lock;
60 } sion_lockdata = SION_FDDATA_INITIALIZER;
61 #endif
62 
63 int _sion_lock_register_lock_callbacks(int lock(void *), int unlock(void *), void *lock_data) {
64  int rc = SION_SUCCESS;
65 
66 
67  lock(lock_data);
68  DPRINTFP((2, "_sion_lock_register_lock_callbacks", _SION_DEFAULT_RANK, "enter\n"));
69  if(_sion_lock_user_cb.lock_defined==1) {
70  rc=SION_NOT_SUCCESS;
71  } else {
72  _sion_lock_user_cb.lock_defined=1;
73  _sion_lock_user_cb.user_lock=lock;
74  _sion_lock_user_cb.user_unlock=unlock;
75  _sion_lock_user_cb.user_lock_data=lock_data;
76  }
77  DPRINTFP((2, "_sion_lock_register_lock_callbacks", _SION_DEFAULT_RANK, "lock and unlock function defined, rc=%d\n",rc));
78  unlock(lock_data);
79 
80 
81  return(rc);
82 }
83 
84 int _sion_lock_user_callbacks_defined() {
85  int rc;
86  _sion_lock();
87  rc=_sion_lock_user_cb.lock_defined;
88  _sion_unlock();
89  DPRINTFP((2, "_sion_lock_user_callbacks_defined", _SION_DEFAULT_RANK, "check user lock cbs, rc=%d\n",rc));
90  return(rc);
91 };
92 
93 
94 #ifdef _USE_PTHREADS
95 int _sion_lock() {
96  int rc=SION_SUCCESS;
97  if(_sion_lock_user_cb.lock_defined==1) {
98  _sion_lock_user_cb.user_lock(_sion_lock_user_cb.user_lock_data);
99  } else {
100  if(pthread_mutex_lock(&sion_lockdata.lock)) {
101  rc=SION_NOT_SUCCESS;
102  };
103  }
104  return(rc);
105 };
106 
107 int _sion_unlock() {
108  int rc=SION_SUCCESS;
109  if(_sion_lock_user_cb.lock_defined==1) {
110  _sion_lock_user_cb.user_unlock(_sion_lock_user_cb.user_lock_data);
111  } else {
112  if(pthread_mutex_unlock(&sion_lockdata.lock)) {
113  rc=SION_NOT_SUCCESS;
114  }
115  }
116  return(rc);
117 }
118 
119 #else
120 
121 int _sion_lock() {
122  if(_sion_lock_user_cb.lock_defined==1) {
123  _sion_lock_user_cb.user_lock(_sion_lock_user_cb.user_lock_data);
124  }
125  return(SION_SUCCESS);
126 };
127 int _sion_unlock() {
128  if(_sion_lock_user_cb.lock_defined==1) {
129  _sion_lock_user_cb.user_unlock(_sion_lock_user_cb.user_lock_data);
130  }
131  return(SION_SUCCESS);
132 };
133 
134 #endif
Sion Time Stamp Header.