MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
mysql_socket.h
Go to the documentation of this file.
1 /* Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
2 
3 This program is free software; you can redistribute it and/or
4 modify it under the terms of the GNU General Public License as
5 published by the Free Software Foundation; version 2 of the
6 License.
7 
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12 
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
16 02110-1301 USA
17 */
18 
19 #ifndef MYSQL_SOCKET_H
20 #define MYSQL_SOCKET_H
21 
22 /* For strlen() */
23 #include <string.h>
24 /* For MY_STAT */
25 #include <my_dir.h>
26 /* For my_chsize */
27 #include <my_sys.h>
28 /* For socket api */
29 #ifdef __WIN__
30  #include <ws2def.h>
31  #include <winsock2.h>
32  #include <MSWSock.h>
33  #define SOCKBUF_T char
34 #else
35  #include <netinet/in.h>
36  #define SOCKBUF_T void
37 #endif
38 
43 #include "mysql/psi/psi.h"
44 
55 #ifdef HAVE_PSI_SOCKET_INTERFACE
56  #define mysql_socket_register(P1, P2, P3) \
57  inline_mysql_socket_register(P1, P2, P3)
58 #else
59  #define mysql_socket_register(P1, P2, P3) \
60  do {} while (0)
61 #endif
62 
64 {
66  my_socket fd;
67 
73  struct PSI_socket *m_psi;
74 };
75 
81 
82 
87 //MYSQL_SOCKET MYSQL_INVALID_SOCKET= {INVALID_SOCKET, NULL};
88 #define MYSQL_INVALID_SOCKET mysql_socket_invalid()
89 
95 static inline MYSQL_SOCKET
96 mysql_socket_invalid()
97 {
98  MYSQL_SOCKET mysql_socket= {INVALID_SOCKET, NULL};
99  return mysql_socket;
100 }
101 
110 static inline void
111 mysql_socket_set_address(
112 #ifdef HAVE_PSI_SOCKET_INTERFACE
113  MYSQL_SOCKET socket,
114  const struct sockaddr *addr,
115  socklen_t addr_len
116 #else
117  MYSQL_SOCKET socket __attribute__ ((unused)),
118  const struct sockaddr *addr __attribute__ ((unused)),
119  socklen_t addr_len __attribute__ ((unused))
120 #endif
121 )
122 {
123 #ifdef HAVE_PSI_SOCKET_INTERFACE
124  if (socket.m_psi != NULL)
125  PSI_SOCKET_CALL(set_socket_info)(socket.m_psi, NULL, addr, addr_len);
126 #endif
127 }
128 
134 static inline void
135 mysql_socket_set_thread_owner(
136 #ifdef HAVE_PSI_SOCKET_INTERFACE
137 MYSQL_SOCKET socket
138 #else
139 MYSQL_SOCKET socket __attribute__ ((unused))
140 #endif
141 )
142 {
143 #ifdef HAVE_PSI_SOCKET_INTERFACE
144  if (socket.m_psi != NULL)
145  PSI_SOCKET_CALL(set_socket_thread_owner)(socket.m_psi);
146 #endif
147 }
148 
154 static inline my_socket
155 mysql_socket_getfd(MYSQL_SOCKET mysql_socket)
156 {
157  return mysql_socket.fd;
158 }
159 
166 static inline void
167 mysql_socket_setfd(MYSQL_SOCKET *mysql_socket, my_socket fd)
168 {
169  if (likely(mysql_socket != NULL))
170  mysql_socket->fd= fd;
171 }
172 
183 #ifdef HAVE_PSI_SOCKET_INTERFACE
184  #define MYSQL_SOCKET_WAIT_VARIABLES(LOCKER, STATE) \
185  struct PSI_socket_locker* LOCKER; \
186  PSI_socket_locker_state STATE;
187 #else
188  #define MYSQL_SOCKET_WAIT_VARIABLES(LOCKER, STATE)
189 #endif
190 
203 #ifdef HAVE_PSI_SOCKET_INTERFACE
204  #define MYSQL_START_SOCKET_WAIT(LOCKER, STATE, SOCKET, OP, COUNT) \
205  LOCKER= inline_mysql_start_socket_wait(STATE, SOCKET, OP, COUNT,\
206  __FILE__, __LINE__)
207 #else
208  #define MYSQL_START_SOCKET_WAIT(LOCKER, STATE, SOCKET, OP, COUNT) \
209  do {} while (0)
210 #endif
211 
220 #ifdef HAVE_PSI_SOCKET_INTERFACE
221  #define MYSQL_END_SOCKET_WAIT(LOCKER, COUNT) \
222  inline_mysql_end_socket_wait(LOCKER, COUNT)
223 #else
224  #define MYSQL_END_SOCKET_WAIT(LOCKER, COUNT) \
225  do {} while (0)
226 #endif
227 
228 #ifdef HAVE_PSI_SOCKET_INTERFACE
229  #define MYSQL_SOCKET_SET_STATE(SOCKET, STATE) \
230  inline_mysql_socket_set_state(SOCKET, STATE)
231 #else
232  #define MYSQL_SOCKET_SET_STATE(SOCKET, STATE) \
233  do {} while (0)
234 #endif
235 
236 #ifdef HAVE_PSI_SOCKET_INTERFACE
237 
241 static inline struct PSI_socket_locker*
242 inline_mysql_start_socket_wait(PSI_socket_locker_state *state,
243  MYSQL_SOCKET mysql_socket,
244  enum PSI_socket_operation op,
245  size_t byte_count,
246  const char *src_file, int src_line)
247 {
248  struct PSI_socket_locker *locker;
249  if (mysql_socket.m_psi != NULL)
250  {
251  locker= PSI_SOCKET_CALL(start_socket_wait)
252  (state, mysql_socket.m_psi, op, byte_count, src_file, src_line);
253  }
254  else
255  locker= NULL;
256  return locker;
257 }
258 
263 static inline void
264 inline_mysql_end_socket_wait(struct PSI_socket_locker *locker, size_t byte_count)
265 {
266  if (locker != NULL)
267  PSI_SOCKET_CALL(end_socket_wait)(locker, byte_count);
268 }
269 
276 static inline void
277 inline_mysql_socket_set_state(MYSQL_SOCKET socket, enum PSI_socket_state state)
278 {
279  if (socket.m_psi != NULL)
280  PSI_SOCKET_CALL(set_socket_state)(socket.m_psi, state);
281 }
282 #endif /* HAVE_PSI_SOCKET_INTERFACE */
283 
294 #ifdef HAVE_PSI_SOCKET_INTERFACE
295  #define mysql_socket_socket(K, D, T, P) \
296  inline_mysql_socket_socket(K, D, T, P)
297 #else
298  #define mysql_socket_socket(K, D, T, P) \
299  inline_mysql_socket_socket(D, T, P)
300 #endif
301 
310 #ifdef HAVE_PSI_SOCKET_INTERFACE
311  #define mysql_socket_bind(FD, AP, L) \
312  inline_mysql_socket_bind(__FILE__, __LINE__, FD, AP, L)
313 #else
314  #define mysql_socket_bind(FD, AP, L) \
315  inline_mysql_socket_bind(FD, AP, L)
316 #endif
317 
326 #ifdef HAVE_PSI_SOCKET_INTERFACE
327  #define mysql_socket_getsockname(FD, AP, LP) \
328  inline_mysql_socket_getsockname(__FILE__, __LINE__, FD, AP, LP)
329 #else
330  #define mysql_socket_getsockname(FD, AP, LP) \
331  inline_mysql_socket_getsockname(FD, AP, LP)
332 #endif
333 
342 #ifdef HAVE_PSI_SOCKET_INTERFACE
343  #define mysql_socket_connect(FD, AP, L) \
344  inline_mysql_socket_connect(__FILE__, __LINE__, FD, AP, L)
345 #else
346  #define mysql_socket_connect(FD, AP, L) \
347  inline_mysql_socket_connect(FD, AP, L)
348 #endif
349 
358 #ifdef HAVE_PSI_SOCKET_INTERFACE
359  #define mysql_socket_getpeername(FD, AP, LP) \
360  inline_mysql_socket_getpeername(__FILE__, __LINE__, FD, AP, LP)
361 #else
362  #define mysql_socket_getpeername(FD, AP, LP) \
363  inline_mysql_socket_getpeername(FD, AP, LP)
364 #endif
365 
375 #ifdef HAVE_PSI_SOCKET_INTERFACE
376  #define mysql_socket_send(FD, B, N, FL) \
377  inline_mysql_socket_send(__FILE__, __LINE__, FD, B, N, FL)
378 #else
379  #define mysql_socket_send(FD, B, N, FL) \
380  inline_mysql_socket_send(FD, B, N, FL)
381 #endif
382 
392 #ifdef HAVE_PSI_SOCKET_INTERFACE
393  #define mysql_socket_recv(FD, B, N, FL) \
394  inline_mysql_socket_recv(__FILE__, __LINE__, FD, B, N, FL)
395 #else
396  #define mysql_socket_recv(FD, B, N, FL) \
397  inline_mysql_socket_recv(FD, B, N, FL)
398 #endif
399 
411 #ifdef HAVE_PSI_SOCKET_INTERFACE
412  #define mysql_socket_sendto(FD, B, N, FL, AP, L) \
413  inline_mysql_socket_sendto(__FILE__, __LINE__, FD, B, N, FL, AP, L)
414 #else
415  #define mysql_socket_sendto(FD, B, N, FL, AP, L) \
416  inline_mysql_socket_sendto(FD, B, N, FL, AP, L)
417 #endif
418 
430 #ifdef HAVE_PSI_SOCKET_INTERFACE
431  #define mysql_socket_recvfrom(FD, B, N, FL, AP, LP) \
432  inline_mysql_socket_recvfrom(__FILE__, __LINE__, FD, B, N, FL, AP, LP)
433 #else
434  #define mysql_socket_recvfrom(FD, B, N, FL, AP, LP) \
435  inline_mysql_socket_recvfrom(FD, B, N, FL, AP, LP)
436 #endif
437 
448 #ifdef HAVE_PSI_SOCKET_INTERFACE
449  #define mysql_socket_getsockopt(FD, LV, ON, OP, OL) \
450  inline_mysql_socket_getsockopt(__FILE__, __LINE__, FD, LV, ON, OP, OL)
451 #else
452  #define mysql_socket_getsockopt(FD, LV, ON, OP, OL) \
453  inline_mysql_socket_getsockopt(FD, LV, ON, OP, OL)
454 #endif
455 
466 #ifdef HAVE_PSI_SOCKET_INTERFACE
467  #define mysql_socket_setsockopt(FD, LV, ON, OP, OL) \
468  inline_mysql_socket_setsockopt(__FILE__, __LINE__, FD, LV, ON, OP, OL)
469 #else
470  #define mysql_socket_setsockopt(FD, LV, ON, OP, OL) \
471  inline_mysql_socket_setsockopt(FD, LV, ON, OP, OL)
472 #endif
473 
481 #ifdef HAVE_PSI_SOCKET_INTERFACE
482  #define mysql_socket_listen(FD, N) \
483  inline_mysql_socket_listen(__FILE__, __LINE__, FD, N)
484 #else
485  #define mysql_socket_listen(FD, N) \
486  inline_mysql_socket_listen(FD, N)
487 #endif
488 
498 #ifdef HAVE_PSI_SOCKET_INTERFACE
499  #define mysql_socket_accept(K, FD, AP, LP) \
500  inline_mysql_socket_accept(__FILE__, __LINE__, K, FD, AP, LP)
501 #else
502  #define mysql_socket_accept(K, FD, AP, LP) \
503  inline_mysql_socket_accept(FD, AP, LP)
504 #endif
505 
512 #ifdef HAVE_PSI_SOCKET_INTERFACE
513  #define mysql_socket_close(FD) \
514  inline_mysql_socket_close(__FILE__, __LINE__, FD)
515 #else
516  #define mysql_socket_close(FD) \
517  inline_mysql_socket_close(FD)
518 #endif
519 
527 #ifdef HAVE_PSI_SOCKET_INTERFACE
528  #define mysql_socket_shutdown(FD, H) \
529  inline_mysql_socket_shutdown(__FILE__, __LINE__, FD, H)
530 #else
531  #define mysql_socket_shutdown(FD, H) \
532  inline_mysql_socket_shutdown(FD, H)
533 #endif
534 
535 #ifdef HAVE_PSI_SOCKET_INTERFACE
536 static inline void inline_mysql_socket_register(
537  const char *category,
538  PSI_socket_info *info,
539  int count)
540 {
541  PSI_SOCKET_CALL(register_socket)(category, info, count);
542 }
543 #endif
544 
547 static inline MYSQL_SOCKET
548 inline_mysql_socket_socket
549 (
550 #ifdef HAVE_PSI_SOCKET_INTERFACE
551  PSI_socket_key key,
552 #endif
553  int domain, int type, int protocol)
554 {
555  MYSQL_SOCKET mysql_socket= MYSQL_INVALID_SOCKET;
556  mysql_socket.fd= socket(domain, type, protocol);
557 
558 #ifdef HAVE_PSI_SOCKET_INTERFACE
559  if (likely(mysql_socket.fd != INVALID_SOCKET))
560  {
561  mysql_socket.m_psi= PSI_SOCKET_CALL(init_socket)
562  (key, (const my_socket*)&mysql_socket.fd, NULL, 0);
563  }
564 #endif
565  return mysql_socket;
566 }
567 
570 static inline int
571 inline_mysql_socket_bind
572 (
573 #ifdef HAVE_PSI_SOCKET_INTERFACE
574  const char *src_file, uint src_line,
575 #endif
576  MYSQL_SOCKET mysql_socket, const struct sockaddr *addr, socklen_t len)
577 {
578  int result;
579 
580 #ifdef HAVE_PSI_SOCKET_INTERFACE
581  if (mysql_socket.m_psi != NULL)
582  {
583  /* Instrumentation start */
584  PSI_socket_locker_state state;
585  PSI_socket_locker *locker;
586  locker= PSI_SOCKET_CALL(start_socket_wait)
587  (&state, mysql_socket.m_psi, PSI_SOCKET_BIND, (size_t)0, src_file, src_line);
588 
589  /* Instrumented code */
590  result= bind(mysql_socket.fd, addr, len);
591 
592  /* Instrumentation end */
593  if (result == 0)
594  PSI_SOCKET_CALL(set_socket_info)(mysql_socket.m_psi, NULL, addr, len);
595 
596  if (locker != NULL)
597  PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0);
598 
599  return result;
600  }
601 #endif
602 
603  /* Non instrumented code */
604  result= bind(mysql_socket.fd, addr, len);
605  return result;
606 }
607 
610 static inline int
611 inline_mysql_socket_getsockname
612 (
613 #ifdef HAVE_PSI_SOCKET_INTERFACE
614  const char *src_file, uint src_line,
615 #endif
616  MYSQL_SOCKET mysql_socket, struct sockaddr *addr, socklen_t *len)
617 {
618  int result;
619 
620 #ifdef HAVE_PSI_SOCKET_INTERFACE
621  if (mysql_socket.m_psi != NULL)
622  {
623  /* Instrumentation start */
624  PSI_socket_locker *locker;
625  PSI_socket_locker_state state;
626  locker= PSI_SOCKET_CALL(start_socket_wait)
627  (&state, mysql_socket.m_psi, PSI_SOCKET_BIND, (size_t)0, src_file, src_line);
628 
629  /* Instrumented code */
630  result= getsockname(mysql_socket.fd, addr, len);
631 
632  /* Instrumentation end */
633  if (locker != NULL)
634  PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0);
635 
636  return result;
637  }
638 #endif
639 
640  /* Non instrumented code */
641  result= getsockname(mysql_socket.fd, addr, len);
642 
643  return result;
644 }
645 
648 static inline int
649 inline_mysql_socket_connect
650 (
651 #ifdef HAVE_PSI_SOCKET_INTERFACE
652  const char *src_file, uint src_line,
653 #endif
654  MYSQL_SOCKET mysql_socket, const struct sockaddr *addr, socklen_t len)
655 {
656  int result;
657 
658 #ifdef HAVE_PSI_SOCKET_INTERFACE
659  if (mysql_socket.m_psi != NULL)
660  {
661  /* Instrumentation start */
662  PSI_socket_locker *locker;
663  PSI_socket_locker_state state;
664  locker= PSI_SOCKET_CALL(start_socket_wait)
665  (&state, mysql_socket.m_psi, PSI_SOCKET_CONNECT, (size_t)0, src_file, src_line);
666 
667  /* Instrumented code */
668  result= connect(mysql_socket.fd, addr, len);
669 
670  /* Instrumentation end */
671  if (locker != NULL)
672  PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0);
673 
674  return result;
675  }
676 #endif
677 
678  /* Non instrumented code */
679  result= connect(mysql_socket.fd, addr, len);
680 
681  return result;
682 }
683 
686 static inline int
687 inline_mysql_socket_getpeername
688 (
689 #ifdef HAVE_PSI_SOCKET_INTERFACE
690  const char *src_file, uint src_line,
691 #endif
692  MYSQL_SOCKET mysql_socket, struct sockaddr *addr, socklen_t *len)
693 {
694  int result;
695 
696 #ifdef HAVE_PSI_SOCKET_INTERFACE
697  if (mysql_socket.m_psi != NULL)
698  {
699  /* Instrumentation start */
700  PSI_socket_locker *locker;
701  PSI_socket_locker_state state;
702  locker= PSI_SOCKET_CALL(start_socket_wait)
703  (&state, mysql_socket.m_psi, PSI_SOCKET_BIND, (size_t)0, src_file, src_line);
704 
705  /* Instrumented code */
706  result= getpeername(mysql_socket.fd, addr, len);
707 
708  /* Instrumentation end */
709  if (locker != NULL)
710  PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0);
711 
712  return result;
713  }
714 #endif
715 
716  /* Non instrumented code */
717  result= getpeername(mysql_socket.fd, addr, len);
718 
719  return result;
720 }
721 
724 static inline ssize_t
725 inline_mysql_socket_send
726 (
727 #ifdef HAVE_PSI_SOCKET_INTERFACE
728  const char *src_file, uint src_line,
729 #endif
730  MYSQL_SOCKET mysql_socket, const SOCKBUF_T *buf, size_t n, int flags)
731 {
732  ssize_t result;
733 
734 #ifdef HAVE_PSI_SOCKET_INTERFACE
735  if (mysql_socket.m_psi != NULL)
736  {
737  /* Instrumentation start */
738  PSI_socket_locker *locker;
739  PSI_socket_locker_state state;
740  locker= PSI_SOCKET_CALL(start_socket_wait)
741  (&state, mysql_socket.m_psi, PSI_SOCKET_SEND, n, src_file, src_line);
742 
743  /* Instrumented code */
744  result= send(mysql_socket.fd, buf, IF_WIN((int),) n, flags);
745 
746  /* Instrumentation end */
747  if (locker != NULL)
748  {
749  size_t bytes_written;
750  bytes_written= (result > -1) ? result : 0;
751  PSI_SOCKET_CALL(end_socket_wait)(locker, bytes_written);
752  }
753 
754  return result;
755  }
756 #endif
757 
758  /* Non instrumented code */
759  result= send(mysql_socket.fd, buf, IF_WIN((int),) n, flags);
760 
761  return result;
762 }
763 
766 static inline ssize_t
767 inline_mysql_socket_recv
768 (
769 #ifdef HAVE_PSI_SOCKET_INTERFACE
770  const char *src_file, uint src_line,
771 #endif
772  MYSQL_SOCKET mysql_socket, SOCKBUF_T *buf, size_t n, int flags)
773 {
774  ssize_t result;
775 
776 #ifdef HAVE_PSI_SOCKET_INTERFACE
777  if (mysql_socket.m_psi != NULL)
778  {
779  /* Instrumentation start */
780  PSI_socket_locker *locker;
781  PSI_socket_locker_state state;
782  locker= PSI_SOCKET_CALL(start_socket_wait)
783  (&state, mysql_socket.m_psi, PSI_SOCKET_RECV, (size_t)0, src_file, src_line);
784 
785  /* Instrumented code */
786  result= recv(mysql_socket.fd, buf, IF_WIN((int),) n, flags);
787 
788  /* Instrumentation end */
789  if (locker != NULL)
790  {
791  size_t bytes_read;
792  bytes_read= (result > -1) ? result : 0;
793  PSI_SOCKET_CALL(end_socket_wait)(locker, bytes_read);
794  }
795 
796  return result;
797  }
798 #endif
799 
800  /* Non instrumented code */
801  result= recv(mysql_socket.fd, buf, IF_WIN((int),) n, flags);
802 
803  return result;
804 }
805 
808 static inline ssize_t
809 inline_mysql_socket_sendto
810 (
811 #ifdef HAVE_PSI_SOCKET_INTERFACE
812  const char *src_file, uint src_line,
813 #endif
814  MYSQL_SOCKET mysql_socket, const SOCKBUF_T *buf, size_t n, int flags, const struct sockaddr *addr, socklen_t addr_len)
815 {
816  ssize_t result;
817 
818 #ifdef HAVE_PSI_SOCKET_INTERFACE
819  if (mysql_socket.m_psi != NULL)
820  {
821  /* Instrumentation start */
822  PSI_socket_locker *locker;
823  PSI_socket_locker_state state;
824  locker= PSI_SOCKET_CALL(start_socket_wait)
825  (&state, mysql_socket.m_psi, PSI_SOCKET_SEND, n, src_file, src_line);
826 
827  /* Instrumented code */
828  result= sendto(mysql_socket.fd, buf, IF_WIN((int),) n, flags, addr, addr_len);
829 
830  /* Instrumentation end */
831  if (locker != NULL)
832  {
833  size_t bytes_written;
834  bytes_written = (result > -1) ? result : 0;
835  PSI_SOCKET_CALL(end_socket_wait)(locker, bytes_written);
836  }
837 
838  return result;
839  }
840 #endif
841 
842  /* Non instrumented code */
843  result= sendto(mysql_socket.fd, buf, IF_WIN((int),) n, flags, addr, addr_len);
844 
845  return result;
846 }
847 
850 static inline ssize_t
851 inline_mysql_socket_recvfrom
852 (
853 #ifdef HAVE_PSI_SOCKET_INTERFACE
854  const char *src_file, uint src_line,
855 #endif
856  MYSQL_SOCKET mysql_socket, SOCKBUF_T *buf, size_t n, int flags,
857  struct sockaddr *addr, socklen_t *addr_len)
858 {
859  ssize_t result;
860 
861 #ifdef HAVE_PSI_SOCKET_INTERFACE
862  if (mysql_socket.m_psi != NULL)
863  {
864  /* Instrumentation start */
865  PSI_socket_locker *locker;
866  PSI_socket_locker_state state;
867  locker= PSI_SOCKET_CALL(start_socket_wait)
868  (&state, mysql_socket.m_psi, PSI_SOCKET_RECV, (size_t)0, src_file, src_line);
869 
870  /* Instrumented code */
871  result= recvfrom(mysql_socket.fd, buf, IF_WIN((int),) n, flags, addr, addr_len);
872 
873  /* Instrumentation end */
874  if (locker != NULL)
875  {
876  size_t bytes_read;
877  bytes_read = (result > -1) ? result : 0;
878  PSI_SOCKET_CALL(end_socket_wait)(locker, bytes_read);
879  }
880 
881  return result;
882  }
883 #endif
884 
885  /* Non instrumented code */
886  result= recvfrom(mysql_socket.fd, buf, IF_WIN((int),) n, flags, addr, addr_len);
887 
888  return result;
889 }
890 
893 static inline int
894 inline_mysql_socket_getsockopt
895 (
896 #ifdef HAVE_PSI_SOCKET_INTERFACE
897  const char *src_file, uint src_line,
898 #endif
899  MYSQL_SOCKET mysql_socket, int level, int optname, SOCKBUF_T *optval, socklen_t *optlen)
900 {
901  int result;
902 
903 #ifdef HAVE_PSI_SOCKET_INTERFACE
904  if (mysql_socket.m_psi != NULL)
905  {
906  /* Instrumentation start */
907  PSI_socket_locker *locker;
908  PSI_socket_locker_state state;
909  locker= PSI_SOCKET_CALL(start_socket_wait)
910  (&state, mysql_socket.m_psi, PSI_SOCKET_OPT, (size_t)0, src_file, src_line);
911 
912  /* Instrumented code */
913  result= getsockopt(mysql_socket.fd, level, optname, optval, optlen);
914 
915  /* Instrumentation end */
916  if (locker != NULL)
917  PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0);
918 
919  return result;
920  }
921 #endif
922 
923  /* Non instrumented code */
924  result= getsockopt(mysql_socket.fd, level, optname, optval, optlen);
925 
926  return result;
927 }
928 
931 static inline int
932 inline_mysql_socket_setsockopt
933 (
934 #ifdef HAVE_PSI_SOCKET_INTERFACE
935  const char *src_file, uint src_line,
936 #endif
937  MYSQL_SOCKET mysql_socket, int level, int optname, const SOCKBUF_T *optval,
938  socklen_t optlen)
939 {
940  int result;
941 
942 #ifdef HAVE_PSI_SOCKET_INTERFACE
943  if (mysql_socket.m_psi)
944  {
945  /* Instrumentation start */
946  PSI_socket_locker *locker;
947  PSI_socket_locker_state state;
948  locker= PSI_SOCKET_CALL(start_socket_wait)
949  (&state, mysql_socket.m_psi, PSI_SOCKET_OPT, (size_t)0, src_file, src_line);
950 
951  /* Instrumented code */
952  result= setsockopt(mysql_socket.fd, level, optname, optval, optlen);
953 
954  /* Instrumentation end */
955  if (locker != NULL)
956  PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0);
957 
958  return result;
959  }
960 #endif
961 
962  /* Non instrumented code */
963  result= setsockopt(mysql_socket.fd, level, optname, optval, optlen);
964 
965  return result;
966 }
967 
970 static inline int
971 inline_mysql_socket_listen
972 (
973 #ifdef HAVE_PSI_SOCKET_INTERFACE
974  const char *src_file, uint src_line,
975 #endif
976  MYSQL_SOCKET mysql_socket, int backlog)
977 {
978  int result;
979 
980 #ifdef HAVE_PSI_SOCKET_INTERFACE
981  if (mysql_socket.m_psi != NULL)
982  {
983  /* Instrumentation start */
984  PSI_socket_locker *locker;
985  PSI_socket_locker_state state;
986  locker= PSI_SOCKET_CALL(start_socket_wait)
987  (&state, mysql_socket.m_psi, PSI_SOCKET_CONNECT, (size_t)0, src_file, src_line);
988 
989  /* Instrumented code */
990  result= listen(mysql_socket.fd, backlog);
991 
992  /* Instrumentation end */
993  if (locker != NULL)
994  PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0);
995 
996  return result;
997  }
998 #endif
999 
1000  /* Non instrumented code */
1001  result= listen(mysql_socket.fd, backlog);
1002 
1003  return result;
1004 }
1005 
1008 static inline MYSQL_SOCKET
1009 inline_mysql_socket_accept
1010 (
1011 #ifdef HAVE_PSI_SOCKET_INTERFACE
1012  const char *src_file, uint src_line, PSI_socket_key key,
1013 #endif
1014  MYSQL_SOCKET socket_listen, struct sockaddr *addr, socklen_t *addr_len)
1015 {
1016  MYSQL_SOCKET socket_accept= MYSQL_INVALID_SOCKET;
1017  socklen_t addr_length= (addr_len != NULL) ? *addr_len : 0;
1018 
1019 #ifdef HAVE_PSI_SOCKET_INTERFACE
1020  if (socket_listen.m_psi != NULL)
1021  {
1022  /* Instrumentation start */
1023  PSI_socket_locker *locker;
1024  PSI_socket_locker_state state;
1025  locker= PSI_SOCKET_CALL(start_socket_wait)
1026  (&state, socket_listen.m_psi, PSI_SOCKET_CONNECT, (size_t)0, src_file, src_line);
1027 
1028  /* Instrumented code */
1029  socket_accept.fd= accept(socket_listen.fd, addr, &addr_length);
1030 
1031  /* Instrumentation end */
1032  if (locker != NULL)
1033  PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0);
1034  }
1035  else
1036 #endif
1037  {
1038  /* Non instrumented code */
1039  socket_accept.fd= accept(socket_listen.fd, addr, &addr_length);
1040  }
1041 
1042 #ifdef HAVE_PSI_SOCKET_INTERFACE
1043  if (likely(socket_accept.fd != INVALID_SOCKET))
1044  {
1045  /* Initialize the instrument with the new socket descriptor and address */
1046  socket_accept.m_psi= PSI_SOCKET_CALL(init_socket)
1047  (key, (const my_socket*)&socket_accept.fd, addr, addr_length);
1048  }
1049 #endif
1050 
1051  return socket_accept;
1052 }
1053 
1056 static inline int
1057 inline_mysql_socket_close
1058 (
1059 #ifdef HAVE_PSI_SOCKET_INTERFACE
1060  const char *src_file, uint src_line,
1061 #endif
1062  MYSQL_SOCKET mysql_socket)
1063 {
1064  int result;
1065 
1066 #ifdef HAVE_PSI_SOCKET_INTERFACE
1067  if (mysql_socket.m_psi != NULL)
1068  {
1069  /* Instrumentation start */
1070  PSI_socket_locker *locker;
1071  PSI_socket_locker_state state;
1072  locker= PSI_SOCKET_CALL(start_socket_wait)
1073  (&state, mysql_socket.m_psi, PSI_SOCKET_CLOSE, (size_t)0, src_file, src_line);
1074 
1075  /* Instrumented code */
1076  result= closesocket(mysql_socket.fd);
1077 
1078  /* Instrumentation end */
1079  if (locker != NULL)
1080  PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0);
1081  /* Remove the instrumentation for this socket. */
1082  if (mysql_socket.m_psi != NULL)
1083  PSI_SOCKET_CALL(destroy_socket)(mysql_socket.m_psi);
1084 
1085  return result;
1086  }
1087 #endif
1088 
1089  /* Non instrumented code */
1090  result= closesocket(mysql_socket.fd);
1091 
1092  return result;
1093 }
1094 
1097 static inline int
1098 inline_mysql_socket_shutdown
1099 (
1100 #ifdef HAVE_PSI_SOCKET_INTERFACE
1101  const char *src_file, uint src_line,
1102 #endif
1103  MYSQL_SOCKET mysql_socket, int how)
1104 {
1105  int result;
1106 
1107 #ifdef __WIN__
1108  static LPFN_DISCONNECTEX DisconnectEx = NULL;
1109  if (DisconnectEx == NULL)
1110  {
1111  DWORD dwBytesReturned;
1112  GUID guidDisconnectEx = WSAID_DISCONNECTEX;
1113  WSAIoctl(mysql_socket.fd, SIO_GET_EXTENSION_FUNCTION_POINTER,
1114  &guidDisconnectEx, sizeof(GUID),
1115  &DisconnectEx, sizeof(DisconnectEx),
1116  &dwBytesReturned, NULL, NULL);
1117  }
1118 #endif
1119 
1120 /* Instrumentation start */
1121 #ifdef HAVE_PSI_SOCKET_INTERFACE
1122  if (mysql_socket.m_psi != NULL)
1123  {
1124  PSI_socket_locker *locker;
1125  PSI_socket_locker_state state;
1126  locker= PSI_SOCKET_CALL(start_socket_wait)
1127  (&state, mysql_socket.m_psi, PSI_SOCKET_SHUTDOWN, (size_t)0, src_file, src_line);
1128 
1129  /* Instrumented code */
1130 #ifdef __WIN__
1131  if (DisconnectEx)
1132  result= (DisconnectEx(mysql_socket.fd, (LPOVERLAPPED) NULL,
1133  (DWORD) 0, (DWORD) 0) == TRUE) ? 0 : -1;
1134  else
1135 #endif
1136  result= shutdown(mysql_socket.fd, how);
1137 
1138  /* Instrumentation end */
1139  if (locker != NULL)
1140  PSI_SOCKET_CALL(end_socket_wait)(locker, (size_t)0);
1141 
1142  return result;
1143  }
1144 #endif
1145 
1146  /* Non instrumented code */
1147 #ifdef __WIN__
1148  if (DisconnectEx)
1149  result= (DisconnectEx(mysql_socket.fd, (LPOVERLAPPED) NULL,
1150  (DWORD) 0, (DWORD) 0) == TRUE) ? 0 : -1;
1151  else
1152 #endif
1153  result= shutdown(mysql_socket.fd, how);
1154 
1155  return result;
1156 }
1157 
1160 #endif
1161