00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef GLOBUS_CALLBACK_H
00018 #define GLOBUS_CALLBACK_H
00019
00031 #include "globus_common_include.h"
00032 #include "globus_module.h"
00033 #include "globus_time.h"
00034
00035 #ifdef __cplusplus
00036 extern "C" {
00037 #endif
00038
00039 extern
00040 globus_module_descriptor_t globus_i_callback_module;
00041
00054 #define GLOBUS_CALLBACK_MODULE (&globus_i_callback_module)
00055
00065 #define GLOBUS_POLL_MODULE GLOBUS_CALLBACK_MODULE
00066
00078 typedef enum
00079 {
00081 GLOBUS_CALLBACK_ERROR_INVALID_CALLBACK_HANDLE = 1024,
00083 GLOBUS_CALLBACK_ERROR_INVALID_SPACE,
00085 GLOBUS_CALLBACK_ERROR_MEMORY_ALLOC,
00087 GLOBUS_CALLBACK_ERROR_INVALID_ARGUMENT,
00089 GLOBUS_CALLBACK_ERROR_ALREADY_CANCELED,
00091 GLOBUS_CALLBACK_ERROR_NO_ACTIVE_CALLBACK
00092 } globus_callback_error_type_t;
00093
00102 typedef int globus_callback_handle_t;
00103
00112 typedef int globus_callback_space_t;
00113
00121 typedef struct globus_l_callback_space_attr_s * globus_callback_space_attr_t;
00122
00133
00134
00146 #define globus_callback_poll(a) \
00147 globus_callback_space_poll((a), GLOBUS_CALLBACK_GLOBAL_SPACE)
00148
00160 #define globus_poll_blocking() \
00161 globus_callback_poll(&globus_i_abstime_infinity)
00162
00174 #define globus_poll_nonblocking() \
00175 globus_callback_poll(&globus_i_abstime_zero)
00176
00188 #define globus_poll() \
00189 globus_poll_nonblocking()
00190
00201 #define globus_signal_poll() \
00202 globus_callback_signal_poll()
00203
00215 #define globus_callback_register_oneshot( \
00216 callback_handle, \
00217 delay_time, \
00218 callback_func, \
00219 callback_user_arg) \
00220 globus_callback_space_register_oneshot( \
00221 (callback_handle), \
00222 (delay_time), \
00223 (callback_func), \
00224 (callback_user_arg), \
00225 GLOBUS_CALLBACK_GLOBAL_SPACE)
00226
00238 #define globus_callback_register_periodic( \
00239 callback_handle, \
00240 delay_time, \
00241 period, \
00242 callback_func, \
00243 callback_user_arg) \
00244 globus_callback_space_register_periodic( \
00245 (callback_handle), \
00246 (delay_time), \
00247 (period), \
00248 (callback_func), \
00249 (callback_user_arg), \
00250 GLOBUS_CALLBACK_GLOBAL_SPACE)
00251
00264 #define globus_callback_register_signal_handler( \
00265 signum, \
00266 persist, \
00267 callback_func, \
00268 callback_user_arg) \
00269 globus_callback_space_register_signal_handler( \
00270 (signum), \
00271 (persist), \
00272 (callback_func), \
00273 (callback_user_arg), \
00274 GLOBUS_CALLBACK_GLOBAL_SPACE)
00275
00276
00277
00281
00282
00312 typedef
00313 void
00314 (*globus_callback_func_t)(
00315 void * user_arg);
00316
00317
00318
00322
00323
00357 globus_result_t
00358 globus_callback_space_register_oneshot(
00359 globus_callback_handle_t * callback_handle,
00360 const globus_reltime_t * delay_time,
00361 globus_callback_func_t callback_func,
00362 void * callback_user_arg,
00363 globus_callback_space_t space);
00364
00365
00366
00370
00371
00409 globus_result_t
00410 globus_callback_space_register_periodic(
00411 globus_callback_handle_t * callback_handle,
00412 const globus_reltime_t * delay_time,
00413 const globus_reltime_t * period,
00414 globus_callback_func_t callback_func,
00415 void * callback_user_arg,
00416 globus_callback_space_t space);
00417
00462 globus_result_t
00463 globus_callback_unregister(
00464 globus_callback_handle_t callback_handle,
00465 globus_callback_func_t unregister_callback,
00466 void * unreg_arg,
00467 globus_bool_t * active);
00468
00496 globus_result_t
00497 globus_callback_adjust_oneshot(
00498 globus_callback_handle_t callback_handle,
00499 const globus_reltime_t * new_delay);
00500
00533 globus_result_t
00534 globus_callback_adjust_period(
00535 globus_callback_handle_t callback_handle,
00536 const globus_reltime_t * new_period);
00537
00538
00542
00543
00585 void
00586 globus_callback_space_poll(
00587 const globus_abstime_t * timestop,
00588 globus_callback_space_t space);
00589
00608 void
00609 globus_callback_signal_poll();
00610
00611
00615
00616
00635 globus_bool_t
00636 globus_callback_get_timeout(
00637 globus_reltime_t * time_left);
00638
00652 globus_bool_t
00653 globus_callback_has_time_expired();
00654
00672 globus_bool_t
00673 globus_callback_was_restarted();
00674
00675
00676
00694 #define GLOBUS_CALLBACK_GLOBAL_SPACE -2
00695
00726 typedef enum
00727 {
00731 GLOBUS_CALLBACK_SPACE_BEHAVIOR_SINGLE,
00735 GLOBUS_CALLBACK_SPACE_BEHAVIOR_SERIALIZED,
00737 GLOBUS_CALLBACK_SPACE_BEHAVIOR_THREADED
00738 } globus_callback_space_behavior_t;
00739
00765 globus_result_t
00766 globus_callback_space_init(
00767 globus_callback_space_t * space,
00768 globus_callback_space_attr_t attr);
00769
00787 globus_result_t
00788 globus_callback_space_reference(
00789 globus_callback_space_t space);
00790
00814 globus_result_t
00815 globus_callback_space_destroy(
00816 globus_callback_space_t space);
00817
00835 globus_result_t
00836 globus_callback_space_attr_init(
00837 globus_callback_space_attr_t * attr);
00838
00853 globus_result_t
00854 globus_callback_space_attr_destroy(
00855 globus_callback_space_attr_t attr);
00856
00873 globus_result_t
00874 globus_callback_space_attr_set_behavior(
00875 globus_callback_space_attr_t attr,
00876 globus_callback_space_behavior_t behavior);
00877
00897 globus_result_t
00898 globus_callback_space_attr_get_behavior(
00899 globus_callback_space_attr_t attr,
00900 globus_callback_space_behavior_t * behavior);
00901
00914 globus_result_t
00915 globus_callback_space_get(
00916 globus_callback_space_t * space);
00917
00929 int
00930 globus_callback_space_get_depth(
00931 globus_callback_space_t space);
00932
00944 globus_bool_t
00945 globus_callback_space_is_single(
00946 globus_callback_space_t space);
00947
00948
00963 #ifdef SIGINT
00964 #define GLOBUS_SIGNAL_INTERRUPT SIGINT
00965 #else
00966 #define GLOBUS_SIGNAL_INTERRUPT 0
00967 #endif
00968
01004 globus_result_t
01005 globus_callback_space_register_signal_handler(
01006 int signum,
01007 globus_bool_t persist,
01008 globus_callback_func_t callback_func,
01009 void * callback_user_arg,
01010 globus_callback_space_t space);
01011
01036 globus_result_t
01037 globus_callback_unregister_signal_handler(
01038 int signum,
01039 globus_callback_func_t unregister_callback,
01040 void * unreg_arg);
01041
01069 void
01070 globus_callback_add_wakeup_handler(
01071 void (*wakeup)(void *),
01072 void * user_arg);
01073
01074 #ifdef __cplusplus
01075 }
01076 #endif
01077
01078 #endif