diff options
author | Andrew Tridgell <tridge@samba.org> | 2000-06-12 15:53:31 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2000-06-12 15:53:31 +0000 |
commit | b2d01bd2dbfed8b35cc324fad42eac562fcad3b4 (patch) | |
tree | 6d2708c53b61bbd441d7c4a65945b65d543b2f73 /source3/include/proto.h | |
parent | 6de513cef43ad83ecd1823bde5a4e05c22224b0f (diff) | |
download | samba-b2d01bd2dbfed8b35cc324fad42eac562fcad3b4.tar.gz samba-b2d01bd2dbfed8b35cc324fad42eac562fcad3b4.tar.bz2 samba-b2d01bd2dbfed8b35cc324fad42eac562fcad3b4.zip |
totally rewrote the async signal, notification and oplock notification
handling in Samba. This was needed due to several limitations and
races in the previous code - as a side effect the new code is much
cleaner :)
in summary:
- changed sys_select() to avoid a signal/select race condition. It is a
rare race but once we have signals doing notification and oplocks it
is important.
- changed our main processing loop to take advantage of the new
sys_select semantics
- split the notify code into implementaion dependent and general
parts. Added the following structure that defines an implementation:
struct cnotify_fns {
void * (*register_notify)(connection_struct *conn, char *path, uint32 flags);
BOOL (*check_notify)(connection_struct *conn, uint16 vuid, char *path, uint32 flags, void *data, time_t t);
void (*remove_notify)(void *data);
};
then I wrote two implementations, one using hash/poll (like our old
code) and the other using the new Linux kernel change notify. It
should be easy to add other change notify implementations by creating
a sructure of the above type.
- fixed a bug in change notify where we were returning the wrong error
code.
- rewrote the core change notify code to be much simpler
- moved to real-time signals for leases and change notify
Amazingly, it all seems to work. I was very surprised!
(This used to be commit 44766c39e0027c762bee8b33b12c621c109a3267)
Diffstat (limited to 'source3/include/proto.h')
-rw-r--r-- | source3/include/proto.h | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 4f5f3d42d3..eabacd4d21 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -183,6 +183,12 @@ void pidfile_create(char *name); char *rep_inet_ntoa(struct in_addr ip); +/*The following definitions come from lib/select.c */ + +void sys_select_signal(void); +int sys_select(int maxfd, fd_set *fds,struct timeval *tval); +int sys_select_intr(int maxfd, fd_set *fds,struct timeval *tval); + /*The following definitions come from lib/signal.c */ void BlockSignals(BOOL block,int signum); @@ -212,9 +218,6 @@ void standard_sub_vsnum(char *str, user_struct *vuser, int snum); /*The following definitions come from lib/system.c */ -int sys_select(int maxfd, fd_set *fds,struct timeval *tval); -int sys_select(int maxfd, fd_set *fds,struct timeval *tval); -int sys_select_intr(int maxfd, fd_set *fds,struct timeval *tval); int sys_usleep(long usecs); int sys_stat(const char *fname,SMB_STRUCT_STAT *sbuf); int sys_fstat(int fd,SMB_STRUCT_STAT *sbuf); @@ -3251,9 +3254,16 @@ BOOL disk_quotas(char *path,SMB_BIG_UINT *bsize,SMB_BIG_UINT *dfree,SMB_BIG_UINT void remove_pending_change_notify_requests_by_fid(files_struct *fsp); void remove_pending_change_notify_requests_by_mid(int mid); void remove_pending_change_notify_requests_by_filename(files_struct *fsp); -BOOL process_pending_change_notify_queue(time_t t); BOOL change_notifies_pending(void); +BOOL process_pending_change_notify_queue(time_t t); BOOL change_notify_set(char *inbuf, files_struct *fsp, connection_struct *conn, uint32 flags); +BOOL init_change_notify(void); +#endif + +/*The following definitions come from smbd/notify_hash.c */ + +#if OLD_NTDOMAIN +struct cnotify_fns *hash_notify_init(void) ; #endif /*The following definitions come from smbd/nttrans.c */ @@ -3301,6 +3311,18 @@ BOOL attempt_close_oplocked_file(files_struct *fsp); BOOL init_oplocks(void); #endif +/*The following definitions come from smbd/oplock_irix.c */ + +#if OLD_NTDOMAIN +struct kernel_oplocks *irix_init_kernel_oplocks(void) ; +#endif + +/*The following definitions come from smbd/oplock_linux.c */ + +#if OLD_NTDOMAIN +struct kernel_oplocks *linux_init_kernel_oplocks(void) ; +#endif + /*The following definitions come from smbd/password.c */ #if OLD_NTDOMAIN |